Статус: Участник
Группы: Участники
Зарегистрирован: 11.06.2014(UTC) Сообщений: 16 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Омцк Сказал(а) «Спасибо»: 3 раз Поблагодарили: 1 раз в 1 постах
|
Пример проверки подписи был корректен, в целом. Оказалось, что интерцепторры Apache CXF изменяют сообщение. Пришлось перенести проверку на более раннюю фазу
|
![thanks](/forum2/Themes/soclean/heart_small.png) 1 пользователь поблагодарил olch за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.03.2013(UTC) Сообщений: 20 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Екатеринбург Сказал(а) «Спасибо»: 2 раз
|
Спасибо, помогли найти решение для моей проблемы. Вот часть рабочего CXF Interceptor: Код:
public SmevCxfInInterceptor()
{
super(Phase.RECEIVE);
addAfter(LoggingInInterceptor.class.getName());
}
@Override
public void handleMessage(SoapMessage message) throws Fault
{
try
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
OutputStreamWriter errorWriter = new OutputStreamWriter(System.err, "UTF-8");
db.setErrorHandler(new DomErrorHandler(new PrintWriter(errorWriter, true)));
InputStream is = message.getContent(InputStream.class);
// Напрямую из input stream читать нельзя т.к. после этого следующие Interceptor'ы не смогут этого сделать. Поэтому скопируем input stream.
// См. образец в LoggingInInterceptor.logInputStream()
CachedOutputStream bos = new CachedOutputStream();
InputStream bis = is instanceof DelegatingInputStream ? ((DelegatingInputStream)is).getInputStream() : is;
IOUtils.copy(bis, bos);
bos.flush();
bis = new SequenceInputStream(bos.getInputStream(), bis);
if (is instanceof DelegatingInputStream)
((DelegatingInputStream)is).setInputStream(bis);
else
message.setContent(InputStream.class, bis);
Document doc = db.parse(bos.getInputStream());
bos.close();
// Собственно проверка ЭЦП:
SmevResponseType result = SmevProcessor.getInstance().checkHeaderSignature(doc, null);
// Результат проверки поместим в контент сообщения, чтобы потом использовать в методах веб-сервиса.
message.setContent(SmevResponseType.class, result);
// Document тоже понадобится в методах веб-сервиса.
message.setContent(Document.class, doc);
}
catch (Throwable e)
{
_log.error("Ошибка при проверке ЭЦП СМЭВ", e);
throw new Fault(e);
}
}
Классы DomErrorHandler, SmevResponseType и SmevProcessor - самописные. Отредактировано пользователем 6 апреля 2015 г. 10:58:35(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close