Статус: Участник
Группы: Участники
Зарегистрирован: 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)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Здравствуйте. Проверка какой подписи завершается ошибкой? СМЭВ? Посмотрите примеры проверки в пакете wss4j.wss4j1_6_3.examples.forum в samples-sources.jar из последней сборки. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.06.2014(UTC) Сообщений: 16 Откуда: Омцк Сказал(а) «Спасибо»: 3 раз Поблагодарили: 1 раз в 1 постах
|
Да, проверка подписи СМЭВ.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Попробуйте SmevDocumentCheckExample.java |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.06.2014(UTC) Сообщений: 16 Откуда: Омцк Сказал(а) «Спасибо»: 3 раз Поблагодарили: 1 раз в 1 постах
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Автор: afev в пакете wss4j.wss4j1_6_3.examples.forum в samples-sources.jar из последней сборки. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.06.2014(UTC) Сообщений: 16 Откуда: Омцк Сказал(а) «Спасибо»: 3 раз Поблагодарили: 1 раз в 1 постах
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.06.2014(UTC) Сообщений: 16 Откуда: Омцк Сказал(а) «Спасибо»: 3 раз Поблагодарили: 1 раз в 1 постах
|
Автор: afev Попробуйте SmevDocumentCheckExample.java В это примере проверка только через веб-сервис СМЭВ, в нашей ситуации это неприемлимо. Кроме того, мы используем jcp 1.0.54
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close