Статус: Участник
Группы: Участники
Зарегистрирован: 27.02.2012(UTC) Сообщений: 24 Откуда: Санкт-Петербург
|
Имеется код подписи xml. Подписанные запросы проходят валидацию на сервисе http://188.254.16.92:9999/gateway/services/SID0003038?wsdl. Пример корректно подписанного сообщения: Код:
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:rev="http://smev.gosuslugi.ru/rev110801" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><soapenv:Header><wsse:Security soapenv:actor="http://smev.gosuslugi.ru/actors/smev" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="CertId-EFA5A10D61AB4A75BF8D8ED1D5320FB5">
MIIC3zCCAo6gAwIBAgIKEsWe8AACAAHVwjAIBgYqhQMCAgMwZTEgMB4GCSqGSIb3DQEJARYRaW5m
b0BjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMRMwEQYDVQQKEwpDUllQVE8tUFJPMR8wHQYDVQQD
ExZUZXN0IENlbnRlciBDUllQVE8tUFJPMB4XDTEyMDIxMzEzMDExNFoXDTE0MTAwNDA3MDk0MVow
ITELMAkGA1UEBhMCUlUxEjAQBgNVBAMTCWxvY2FsaG9zdDBjMBwGBiqFAwICEzASBgcqhQMCAiQA
BgcqhQMCAh4BA0MABEA6ImQDH7j3PCusNnrnVVU+r1jYYKUDkuU17Z8G1JJ1N5hTG3BKLt7tuPoZ
QvtIDs1J6sLF6bd/C3GhoJ2IryP6o4IBYDCCAVwwCwYDVR0PBAQDAgLkMBMGA1UdJQQMMAoGCCsG
AQUFBwMBMB0GA1UdDgQWBBTHD14DVO1CbNajzLNlEgHXrm0l+DAfBgNVHSMEGDAWgBRtj14F2V+s
kReUHpWaBTA4N3oQKjBVBgNVHR8ETjBMMEqgSKBGhkRodHRwOi8vd3d3LmNyeXB0b3Byby5ydS9D
ZXJ0RW5yb2xsL1Rlc3QlMjBDZW50ZXIlMjBDUllQVE8tUFJPKDIpLmNybDCBoAYIKwYBBQUHAQEE
gZMwgZAwMwYIKwYBBQUHMAGGJ2h0dHA6Ly93d3cuY3J5cHRvcHJvLnJ1L29jc3BuYy9vY3NwLnNy
ZjBZBggrBgEFBQcwAoZNaHR0cDovL3d3dy5jcnlwdG9wcm8ucnUvQ2VydEVucm9sbC9wa2ktc2l0
ZV9UZXN0JTIwQ2VudGVyJTIwQ1JZUFRPLVBSTygyKS5jcnQwCAYGKoUDAgIDA0EA887qxpBwQV2w
wtJ2UfhyFmKQM59Fy2vo57N4woi08Edk8owuYTUUxyROPBcHKAcW5bmGPMBA+5AblCol1prVaQ==
</wsse:BinarySecurityToken><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
<ds:Reference URI="#BodyId-C1E3DD32F7384E82AE0080F22ADC5E6C">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
<ds:DigestValue>TiQ29Ll8Q1Pvtc20D0320UXwi04v7q7wCf/4sY/USFo=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
Y+/De9CWM07z4VowmSW23ra1l2xQjm/COlOZeCSeHIfjw2P2KnMfEO3TyH9zcxzxuHpcsPTl9czl
muRaw6y+2Q==
</ds:SignatureValue>
<ds:KeyInfo>
<wsse:SecurityTokenReference><wsse:Reference URI="#CertId-EFA5A10D61AB4A75BF8D8ED1D5320FB5" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></ds:KeyInfo>
</ds:Signature></wsse:Security></soapenv:Header>
<soapenv:Body wsu:Id="BodyId-C1E3DD32F7384E82AE0080F22ADC5E6C">
<rev:createRequestRequest>
</rev:createRequestRequest>
</soapenv:Body>
</soapenv:Envelope>
Но вот самостоятельно проверить подпись в своем коде не удается. Код проверки подписи: Код:
package sx.smev.security;
import com.sun.org.apache.xml.internal.security.Init;
import com.sun.org.apache.xpath.internal.XPathAPI;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ws.security.message.token.X509Security;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import ru.CryptoPro.JCPxml.xmldsig.JCPXMLDSigInit;
import ru.jcp.xml.dsig.internal.dom.XMLDSigRI;
import sx.smev.security.exceptions.XmlVerifyException;
import javax.xml.crypto.KeySelector;
import javax.xml.crypto.MarshalException;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMValidateContext;
import javax.xml.soap.SOAPMessage;
import java.io.ByteArrayInputStream;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
/**
* @author dsaponenko
*/
public class CryptoProXmlVerifier {
private static final Log log = LogFactory.getLog(CryptoProBinarySigner.class);
static {
if (!Init.isInitialized()) {
Init.init();
}
if (!JCPXMLDSigInit.isInitialized()) {
log.info("Start loading JCP for xmldsig");
JCPXMLDSigInit.init();
log.info("JCP for xmldsig loaded");
}
System.setProperty("com.ibm.security.enableCRLDP", "false");
}
public CryptoProXmlVerifier() {
}
public boolean verify(SOAPMessage message) throws XmlVerifyException {
try {
// Extract some nodes to verify document
Document doc = message.getSOAPPart().getEnvelope().getOwnerDocument();
final Element wssecontext = doc.createElementNS(null, "namespaceContext");
wssecontext.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" + "wsse".trim(), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
NodeList secnodeList = XPathAPI.selectNodeList(doc.getDocumentElement(), "//wsse:Security");
Element r = null;
Element el;
if (secnodeList != null && secnodeList.getLength() > 0) {
String actorAttr;
for (int i = 0; i < secnodeList.getLength(); i++) {
el = (Element) secnodeList.item(i);
actorAttr = el.getAttributeNS("http://schemas.xmlsoap.org/soap/envelope/", "actor");
if (actorAttr != null && actorAttr.equals("http://smev.gosuslugi.ru/actors/smev")) {
r = (Element) XPathAPI.selectSingleNode(el, "//wsse:BinarySecurityToken[1]", wssecontext);
break;
}
}
}
if (r == null)
return false;
final X509Security x509 = new X509Security(r);
// Extract certificate
final X509Certificate cert = (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(x509.getToken()));
if (cert == null) {
throw new Exception("Cannot find certificate to verify signature");
}
System.out.println(cert);
// Get signature node
NodeList nl = doc.getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Signature");
if (nl.getLength() == 0) {
throw new Exception("Cannot find Signature element");
}
DOMValidateContext valContext = new DOMValidateContext(KeySelector.singletonKeySelector(cert.getPublicKey()), nl.item(0));
XMLSignature signature = getSignature(valContext);
// Verify signature
return signature.validate(valContext);
} catch (Exception ex) {
throw new XmlVerifyException(ex);
}
}
private XMLSignature getSignature(DOMValidateContext validateContext) throws NoSuchAlgorithmException, MarshalException {
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", new XMLDSigRI());
return fac.unmarshalXMLSignature(validateContext);
}
}
Мы работаем с xmlsec 1.4, поэтому используется сервис провайдер из архива (Найти страницу откуда был взят этот архив не удалось). При этом подпись и проверка подписи успешно осуществляется с библиотеками и сервис-провайдером со страницы http://cryptopro.ru/blog...lzovaniem-kriptopro-jcp, но по ряду причин нет возможности использовать xmlsec 1.5. В lib\ext лежат библиотеки указанных в readme версий. Подпись корректна, а вот проверка подписи не проходит. Код тестирования: Код:
KeyStore ks = SpecUtility.loadKeyStore(SpecUtility.DEFAULT_STORETYPE, null, "123".toCharArray());
X509Certificate certificate =(X509Certificate)ks.getCertificate("tomcat");
PrivateKey privateKey = (PrivateKey) ks.getKey("tomcat", "123".toCharArray());
CryptoProXmlSigner xmlSignature = new CryptoProXmlSigner(certificate, privateKey);
SOAPMessage soapMessage = getSoapMessage(MESSAGE.getBytes("windows-1251"));
/* Подписываем запрос */
xmlSignature.sign(soapMessage);
assertTrue(new CryptoProXmlVerifier().verify(soapMessage1));
В чем может быть проблема? Вложение(я): test_jcp_wss4j1_6.tar.gz (86kb) загружен 11 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,977 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 708 раз в 669 постах
|
Здравствуйте. То есть вы используете JCPxml + xmlsec 1.4, и проверка не выполняется, а если используете CryptoProXMLDSigRI + xmlsec 1.5 - то проходит ? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.02.2012(UTC) Сообщений: 24 Откуда: Санкт-Петербург
|
afev написал:Здравствуйте. То есть вы используете JCPxml + xmlsec 1.4, и проверка не выполняется, а если используете CryptoProXMLDSigRI + xmlsec 1.5 - то проходит ? Верно отчасти. Если я использую CryptoProXMLDSigRI + xmlsec 1.5 из примера со страницы пример, то проверка подписи проходит. Про JCPxml + xmlsec 1.4 не понял. При конструировании фабрики для демаршаллизации сигнатуры используется сервис провайдер: Код:XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", new XMLDSigRI());
, этот сервис провайдер взят из другого примера. Можно обойтись без него при использовании wss4j 1.6?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,977 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 708 раз в 669 постах
|
dsaponenko написал:этот сервис провайдер взят из другого примера. В смысле провайдер более ранний, который был в начале года и использовал xmlsec-1.4 ? Там были ошибки с дублированием xmlns. dsaponenko написал:Можно обойтись без него при использовании wss4j 1.6? В wss4j 1.6 - нет. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.02.2012(UTC) Сообщений: 24 Откуда: Санкт-Петербург
|
afev написал:dsaponenko написал:этот сервис провайдер взят из другого примера. В смысле провайдер более ранний, который был в начале года и использовал xmlsec-1.4 ? Там были ошибки с дублированием xmlns. dsaponenko написал:Можно обойтись без него при использовании wss4j 1.6? В wss4j 1.6 - нет. Да, более ранний. Я в курсе ошибок дублирования, как раз создавал тему по этой проблеме, но эта проблема никак не относится к проверке подписи. Или относится? Итого имеем, CryptoProXMLDSigRI.jar (более ранний) + xmlsec 1.4 + wss4j 1.6. Подпись корректная (проходит проверку на сервисе СМЭВ), надо проверить подпись своими средствами. Код проверки я привел выше. Во всех случаях возвращается false. Исходных кодов сервис-провайдера нет, чтобы посмотреть в чем проблема. На xmlsec 1.5 перейти сейчас нет возможности. Отредактировано пользователем 8 октября 2012 г. 17:07:37(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.02.2012(UTC) Сообщений: 24 Откуда: Санкт-Петербург
|
Какие есть мысли? Как поступить с проверкой подписи?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.02.2012(UTC) Сообщений: 24 Откуда: Санкт-Петербург
|
Более подробный вывод сообщений: Код:
17.10.2012 17:13:59 org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer transform
FINE: Created transform for algorithm: http://www.w3.org/2001/10/xml-exc-c14n#
17.10.2012 17:13:59 org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer transform
FINE: isNodeSet() = true
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.DigesterOutputStream write
FINER: Pre-digested input:
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.DigesterOutputStream write
FINER: <soapenv:Body wsu:Id="BodyId-01B47351B13846D09F66BBCD1E03315D">
<rev:createRequestRequest>
</rev:createRequestRequest>
</soapenv:Body>
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest engineDigest
FINER: ENTRY
17.10.2012 17:13:59 ru.CryptoPro.JCP.pref.JCPPref get
CONFIG: System Preference Node: /ru/CryptoPro/JCP/tools.SelfTester_jar_names=ru.
CryptoPro.JCP.Install.JCPInstaller;ru.CryptoPro.Crypto.JCryptoPInstaller
17.10.2012 17:13:59 ru.CryptoPro.JCP.pref.JCPPref get
CONFIG: System Preference Node: /ru/CryptoPro/JCP/tools.SelfTester_external_clas
sNames=null
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: ENTRY
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: RETURN
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: ENTRY
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: RETURN
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: ENTRY
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest reset
FINER: RETURN
17.10.2012 17:13:59 ru.CryptoPro.JCP.Digest.GostDigest engineDigest
FINER: RETURN
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.dom.DOMReference validate
FINE: Expected digest: F87lC3DsMy+sGtUQeLCRXvmbdcIkE7NeR2/bvvtn+pU=
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.dom.DOMReference validate
FINE: Actual digest: vLrFMDJ9VhzwSDysZnDIwkgUnvo4kF81y2RBfAQWd8k=
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.dom.DOMXMLSignature validate
FINE: Reference[#BodyId-01B47351B13846D09F66BBCD1E03315D] is valid: false
17.10.2012 17:13:59 ru.jcp.xml.dsig.internal.dom.DOMXMLSignature validate
FINE: Couldn't validate the References
Message xml signature is bad
Видно, что дайджесты получились разные. При этом подпись то корректна. При проверке на техпортале подпись валидна. Что делать?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,977 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 708 раз в 669 постах
|
В предыдущей версии проблема была в том (если не ошибаюсь), что брался хеш с данных с дублированием xmlns, потому был неверный. А на портале расчитывается хеш, видимо, правильно. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.02.2012(UTC) Сообщений: 24 Откуда: Санкт-Петербург
|
Что вы имеете в виду? Я пытаюсь проверить подпись корректного документа. Из лога видно, что успешно извлекается body сообщения и для него считается дайджест, где здесь появляется дублирование?
Проблема дублирования xmlns при формировании подписи сейчас нас не беспокоит, обошли ее.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,977 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 708 раз в 669 постах
|
Можете прикрепить XML-документ (исходный и подписанный), который проверяется на техпортале (для которого вы приводили вывод сообщений)? Отредактировано пользователем 18 октября 2012 г. 20:21:15(UTC)
| Причина: Не указана |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close