Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline olch  
#11 Оставлено : 20 ноября 2014 г. 15:59:29(UTC)
olch

Статус: Участник

Группы: Участники
Зарегистрирован: 11.06.2014(UTC)
Сообщений: 16
Российская Федерация
Откуда: Омцк

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Пример проверки подписи был корректен, в целом.
Оказалось, что интерцепторры Apache CXF изменяют сообщение.
Пришлось перенести проверку на более раннюю фазу
thanks 1 пользователь поблагодарил olch за этот пост.
andreypars оставлено 06.04.2015(UTC)
Offline andreypars  
#12 Оставлено : 6 апреля 2015 г. 10:53:51(UTC)
andreypars

Статус: Участник

Группы: Участники
Зарегистрирован: 25.03.2013(UTC)
Сообщений: 20
Российская Федерация
Откуда: Екатеринбург

Сказал(а) «Спасибо»: 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)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы<12
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.