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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline olch  
#1 Оставлено : 13 октября 2014 г. 11:31:27(UTC)
olch

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Пытаюсь валидировать сообщение, подписанное СМЭВ (сообщение имеет 2 подписи: ОВ и СМЭВ). Подписи валидны.
Проверка подписи завершается ошибкой
Код:

javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: org.apache.xml.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID ID-a30521b5-1c66-4de0-a6c4-608e62569c85


Проверка выполняю так:

Код:
 public boolean validate(SOAPMessage message) throws Exception {
        SOAPHeader header = message.getSOAPHeader();
        Document doc = header.getOwnerDocument();

        SOAPBody soapBody = message.getSOAPBody();
        Attr idAttr = soapBody.getAttributeNode("wsu:Id");
        soapBody.setIdAttributeNode(idAttr, true);

        final Element wssecontext = doc.createElementNS(null, "namespaceContext");
        wssecontext.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

        Iterator allHeaders = header.examineAllHeaderElements();
        Element binarySecurityTokenElement = null;
        SOAPHeaderElement headerElement;
        while (allHeaders.hasNext()) {
            headerElement = (SOAPHeaderElement)allHeaders.next();
            if  ("http://smev.gosuslugi.ru/actors/recipient".equals(headerElement.getActor())) {
                binarySecurityTokenElement = (Element) headerElement.getElementsByTagName("wsse:BinarySecurityToken").item(0);
                break;
            }
        }

        if (binarySecurityTokenElement == null) {
            return false;
        }
        final X509Security x509 = new X509Security(binarySecurityTokenElement);
        X509Certificate cert = (X509Certificate) CertificateFactory.getInstance("X.509")
                .generateCertificate(new ByteArrayInputStream(x509.getToken()));
        if (cert == null) {
            throw new Exception("Cannot find certificate to verify signature");
        }
        NodeList nl = doc.getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Signature");
        if (nl.getLength() == 0) {
            throw new Exception("Не найден элемент Signature.");
        }

        DOMValidateContext valContext = new DOMValidateContext(KeySelector.singletonKeySelector(cert.getPublicKey()), nl.item(0));
        XMLSignature signature = fac.unmarshalXMLSignature(valContext);
        return signature.validate(valContext);
    }

Реализация веб-сервиса - Apache CXF. Java 1.7.0_21 (build 1.7.0_21-b11)
Offline Евгений Афанасьев  
#2 Оставлено : 13 октября 2014 г. 11:51:33(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Проверка какой подписи завершается ошибкой? СМЭВ?
Посмотрите примеры проверки в пакете wss4j.wss4j1_6_3.examples.forum в samples-sources.jar из последней сборки.
Offline olch  
#3 Оставлено : 13 октября 2014 г. 11:56:18(UTC)
olch

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Да, проверка подписи СМЭВ.
Offline olch  
#4 Оставлено : 13 октября 2014 г. 14:06:21(UTC)
olch

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Автор: afev Перейти к цитате
Здравствуйте.
Проверка какой подписи завершается ошибкой? СМЭВ?
Посмотрите примеры проверки в пакете wss4j.wss4j1_6_3.examples.forum в samples-sources.jar из последней сборки.


Если смотреть метод SOAPXMLSignatureManager_1_6_3.verifySecuredMessage , то он аналогичен имеющемуся, только отрабатывает с ошибкой
Код:
com.sun.org.apache.xpath.internal.domapi.XPathStylesheetDOM3Exception: Prefix must resolve to a namespace: wsse
	at com.sun.org.apache.xpath.internal.compiler.XPathParser.errorForDOM3(XPathParser.java:657)
	at com.sun.org.apache.xpath.internal.compiler.Lexer.mapNSTokens(Lexer.java:642)
	at com.sun.org.apache.xpath.internal.compiler.Lexer.tokenize(Lexer.java:360)
	at com.sun.org.apache.xpath.internal.compiler.Lexer.tokenize(Lexer.java:100)
	at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(XPathParser.java:114)
	at com.sun.org.apache.xpath.internal.XPath.<init>(XPath.java:180)
	at com.sun.org.apache.xpath.internal.XPathAPI.eval(XPathAPI.java:236)
	at com.sun.org.apache.xpath.internal.XPathAPI.selectNodeList(XPathAPI.java:169)
	at com.sun.org.apache.xpath.internal.XPathAPI.selectNodeList(XPathAPI.java:149)
	at ru.russianpost.erl.fsspa.security.soap.SecurityUtil.validate(SecurityUtil.java:77)
	at ru.russianpost.erl.fsspa.security.soap.SOAPSecurityHandler.handleMessage(SOAPSecurityHandler.java:46)


на строке
Код:
NodeList secnodeList = XPathAPI.selectNodeList(doc.getDocumentElement(), "//wsse:Security");


еще одно отличие - значение атрибута actor: в предлагаемом вами примере это "http://smev.gosuslugi.ru/actors/smev" , нам же нужно проверять заголовок, предназначенный для получателя, то есть с атрибутом actor = "http://smev.gosuslugi.ru/actors/recipient"
Изменив метод соответствующим образом снова приходим к ошибке
Код:
javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: org.apache.xml.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID ...

Аналогичная ошибка обсуждается здесь http://stackoverflow.com...fter-upgrade-to-java7u25 , однако у нас версия java 1.7.0_21

Отредактировано пользователем 13 октября 2014 г. 14:07:49(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#5 Оставлено : 13 октября 2014 г. 14:44:14(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Попробуйте SmevDocumentCheckExample.java
Offline olch  
#6 Оставлено : 13 октября 2014 г. 15:09:14(UTC)
olch

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Это в каком пакете?
Offline Евгений Афанасьев  
#7 Оставлено : 13 октября 2014 г. 15:47:55(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Автор: afev Перейти к цитате
в пакете wss4j.wss4j1_6_3.examples.forum в samples-sources.jar из последней сборки.


Offline olch  
#8 Оставлено : 13 октября 2014 г. 15:56:47(UTC)
olch

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Киньте ссылку на последнюю сборку, пожалуйста. Я смотрю примеры из jcp_plus_jtls_1.0.54.zip отсюда https://www.cryptopro.ru...oducts/csp/jcp/downloads , и, вероятно, это не те примеры...

Отредактировано пользователем 13 октября 2014 г. 15:57:29(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#9 Оставлено : 13 октября 2014 г. 16:54:47(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Тут должны быть.
Offline olch  
#10 Оставлено : 14 октября 2014 г. 11:07:46(UTC)
olch

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 1 раз в 1 постах
Автор: afev Перейти к цитате
Попробуйте SmevDocumentCheckExample.java

В это примере проверка только через веб-сервис СМЭВ, в нашей ситуации это неприемлимо.

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