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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Umnix  
#1 Оставлено : 20 апреля 2012 г. 20:43:13(UTC)
Umnix

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.04.2012(UTC)
Сообщений: 4

Здравствуйте.
Подписываю soap сообщение, пытаюсь проверить через сервис ( http://188.254.16.92:7777/gateway/services/SID0003038 )
получаю ошибку.

<error>
<ns2:errorCode>3</ns2:errorCode>
<ns2:errorMessage>Неверная ЭП сообщения</ns2:errorMessage>
</error>

Хотя сообщение после подписи выглядит почти так же, как и тестовый валидный запрос.

Код:
 public Boolean sign(SOAPMessage message) throws Exception {

        if (message == null) {
            return false;
        }

        // Prepare secured header
        message.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
        message.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
        message.getSOAPPart().getEnvelope().addNamespaceDeclaration("ds", "http://www.w3.org/2000/09/xmldsig#");
        message.getSOAPBody().setAttributeNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "wsu:Id", "body");

        WSSecHeader header = new WSSecHeader();
        header.setActor("http://smev.gosuslugi.ru/actors/smev");
        header.setMustUnderstand(false);

        Element sec = header.insertSecurityHeader(message.getSOAPPart());
        Document doc = message.getSOAPPart().getEnvelope().getOwnerDocument();

        Element token = (Element) sec.appendChild(
                doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:BinarySecurityToken"));
        token.setAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
        token.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
        String certIdGUID = java.util.UUID.randomUUID().toString();
        token.setAttribute("wsu:Id", "CertId-" + certIdGUID);
        token.setAttribute("xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
        token.setAttribute("xmlns:wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
        header.getSecurityHeader().appendChild(token);

        // Prepare signature provider
        XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);


        List<Transform> transformList = new ArrayList<Transform>();
        Transform transformC14N = fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null);
        transformList.add(transformC14N);

        Reference ref = fac.newReference(
                "#body",
                fac.newDigestMethod("http://www.w3.org/2001/04/xmldsig-more#gostr3411", null),
                null, null, null);
                //transformList, null, null);
        //Collections.singletonList(transform), null, null);

        // Make link to signing element
        SignedInfo si = fac.newSignedInfo(
                fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE,
                (C14NMethodParameterSpec) null),
                fac.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411", null),
                Collections.singletonList(ref));

        // Prepare key information to verify signature in future on other side
        KeyInfoFactory kif = fac.getKeyInfoFactory();
        final Object[] obj = samData.clone();
        X509Data x509d = kif.newX509Data(Collections.singletonList((X509Certificate) obj[0]));
        KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d), "Key-" + java.util.UUID.randomUUID().toString());


        // Create signature and sign by private key
        XMLSignature sig = fac.newXMLSignature(si, ki, null, "Signature-" + java.util.UUID.randomUUID().toString(), null);
        DOMSignContext signContext = new DOMSignContext((Key) obj[1], token);
        signContext.putNamespacePrefix(javax.xml.crypto.dsig.XMLSignature.XMLNS, "ds");
        sig.sign(signContext);



        // Insert signature node in document
        Element sigE = (Element) XPathAPI.selectSingleNode(signContext.getParent(), "//ds:Signature");
        Node keyE = XPathAPI.selectSingleNode(sigE, "//ds:KeyInfo", sigE);
        token.appendChild(doc.createTextNode(XPathAPI.selectSingleNode(keyE, "//ds:X509Certificate", keyE).getFirstChild().getNodeValue()));
        keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));
        NodeList chl = keyE.getChildNodes();

        for (int i = 0; i < chl.getLength(); i++) {
            keyE.removeChild(chl.item(i));
        }

        Element secTokenRef = doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:SecurityTokenReference");
        secTokenRef.setAttribute("wsu:Id", "StrId-" + java.util.UUID.randomUUID().toString());
        secTokenRef.setAttribute("xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
        secTokenRef.setAttribute("xmlns:wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
        Node str = keyE.appendChild(secTokenRef);

        Element reference = doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Reference");

        reference.setAttribute("xmlns:wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
        Element strRef = (Element) str.appendChild(reference);

        strRef.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
        strRef.setAttribute("URI", "#CertId-" + certIdGUID);
        header.getSecurityHeader().appendChild(sigE);

        return true;
    }


получившийся xml:
Код:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 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-f9ad9fce-935a-4289-861e-0c294b9171b6" 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">MIIBeTCCASigAwIBAgIEBaaEEjAIBgYqhQMCAgMwMTELMAkGA1UEBhMCUlUxEjAQBgNVBAoTCUNy
eXB0b1BybzEOMAwGA1UEAxMFQWxpYXMwHhcNMTIwMjA5MDk0MTE0WhcNMTMwMjA5MDk0MTE0WjAx
MQswCQYDVQQGEwJSVTESMBAGA1UEChMJQ3J5cHRvUHJvMQ4wDAYDVQQDEwVBbGlhczBjMBwGBiqF
AwICEzASBgcqhQMCAiMBBgcqhQMCAh4BA0MABEAjPxcQ98okKKIpC4qCTVfYvBSoL+q1ZTGr+OH7
F/ObaujgqcHSIX6bVEXaH0gUI3v8Lmx5+39/0X3TV7agnsCYoyYwJDAOBgNVHQ8BAf8EBAMCBsAw
EgYDVR0TAQH/BAgwBgEB/wIBBTAIBgYqhQMCAgMDQQC5s07kzfDuksZiGypn2mGiFZPU4L4DNq43
7KCnoidgK+uxdLpTBTuq1yJty6E3cwCrnNynr9GKYMQHikUAEmLZ</wsse:BinarySecurityToken><ds:Signature Id="Signature-35c6168c-c5cd-4083-8de5-d966be77e65f" 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="#body"><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>E1VFiBqcPyFf2ofw4T4FcrjjTyW++Ih14aqnyHUpcL8=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>LzbBeEyOlTw7y+s+M6yRRPEb997nz3uOocWpjgGWxbgtQbLgJuBm72uYfESyKExzJ3FYOSPoDD1O
dWaGit/pJA==</ds:SignatureValue><ds:KeyInfo Id="Key-c956bcda-be7a-40b2-8a7f-2ea7e0c6b5c8"><wsse:SecurityTokenReference wsu:Id="StrId-e122f453-e047-4e63-bcd6-6e34410b0d5e" 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"><wsse:Reference URI="#CertId-f9ad9fce-935a-4289-861e-0c294b9171b6" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"/></wsse:SecurityTokenReference></ds:KeyInfo></ds:Signature></wsse:Security></soapenv:Header>
	<soapenv:Body wsu:Id="body">
		<ns2:M_Service_Execution_Request xmlns:ns2="http://www.uecard.ru/" xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
			<ns2:Initiator_ID>
				<ns2:Member_ID>0</ns2:Member_ID>
			</ns2:Initiator_ID>
			<ns2:TransactionType>Service_Execution</ns2:TransactionType>
			<ns2:Number>324718804045</ns2:Number>
			<ns2:Date_time>2011-11-24T13:26:44</ns2:Date_time>
			<ns2:Message_Type>Request</ns2:Message_Type>
			<ns2:Service_Identifier>02000000000002000001</ns2:Service_Identifier>
			<ns2:WebServiceURI>GETTIMEMED</ns2:WebServiceURI>
			<ns2:Authentification_Data>
				<ns2:Terminal_Info>111111114402071F1F1FC700</ns2:Terminal_Info>
				<ns2:Unpredictable_Number>4E6BAB64</ns2:Unpredictable_Number>
				<ns2:Operation_Timestamp>120124132636</ns2:Operation_Timestamp>
				<ns2:Extra_Data>064300000000000000000000000075EE64656669EE6564</ns2:Extra_Data>
				<ns2:Request_Hash>DA39A3EE5E6B4B0D3255BFEF95601890AFD80709</ns2:Request_Hash>
				<ns2:AAC>006A</ns2:AAC>
				<ns2:Operation_Info>E01601</ns2:Operation_Info>
				<ns2:Application_Cryptogram>5ACDD864</ns2:Application_Cryptogram>
				<ns2:IC_Challenge>00112233445566778899AABBCCDDEEFF</ns2:IC_Challenge>
				<ns2:Application_PAN_SIN>964350111900000013607839817224</ns2:Application_PAN_SIN>
				<ns2:SecurityCounters>EREREQ==</ns2:SecurityCounters>
				<ns2:TerminalPK>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</ns2:TerminalPK>
			</ns2:Authentification_Data>
			<ns2:Point_Of_Operation>ЕПКУ</ns2:Point_Of_Operation>
			<ns2:Request_Message>PEdFVFRJTUVNRUQ+DQo8Q09ERVJFR0lPTj40MDwvQ09ERVJFR0lPTj4NCjxDT0RFTFBVPjMzMzwvQ09ERUxQVT4JCQkNCjxDT0RFU1BFQz4wOTwvQ09ERVNQRUM+DQo8REFURT4wMi4wNC4yMDEyPC9EQVRFPg0KCSA8VElNRUZST00+OTwvVElNRUZST00+DQoJIDxUSU1FVE8+MTI8L1RJTUVUTz4NCgkgPElTQUNDVVJBVEU+VHJ1ZTwvSVNBQ0NVUkFURT4JDQo8L0dFVFRJTUVNRUQ+</ns2:Request_Message>
		</ns2:M_Service_Execution_Request>
	</soapenv:Body>
</soapenv:Envelope>



Offline Евгений Афанасьев  
#2 Оставлено : 21 апреля 2012 г. 2:33:04(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Здравствуйте.
Вы формировали подпись с помощью wss4j? На этапе проверки хэша уже ошибка (хэш неверный).
А у вас документ и подпись проверяются?
Я не уверен, что представленный подписанный документ действительно получен по указанному примеру.
Я попробовал его выполнить с CryptoProXMLDSigRI.jar (wss4j+jcp), подставив, правда, вместо случ. последовательностей CertId, KeyId, StrId... ваши из документа для проверки хэша, но получил документ без transform. Чтобы алгоритм transform добавился (Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"), нужно открыть строку
...
transformList, null, null);

Отредактировано пользователем 21 апреля 2012 г. 23:26:50(UTC)  | Причина: Не указана

Offline Umnix  
#3 Оставлено : 23 апреля 2012 г. 14:20:42(UTC)
Umnix

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.04.2012(UTC)
Сообщений: 4

afev написал:

Вы формировали подпись с помощью wss4j?

да

afev написал:

А у вас документ и подпись проверяются?

программно - да, через сервис - нет

Код:
    public Boolean verify(SOAPMessage message) throws Exception {

        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);
        if (x509 == null) {
            return false;
        }

        // 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");
        }

        // 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");
        }

        XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);
        // Set public key
        DOMValidateContext valContext = new DOMValidateContext(KeySelector.singletonKeySelector(cert.getPublicKey()), nl.item(0));
        javax.xml.crypto.dsig.XMLSignature signature = fac.unmarshalXMLSignature(valContext);

        // Verify signature
        return signature.validate(valContext);
    }


afev написал:

Я не уверен, что представленный подписанный документ действительно получен по указанному примеру.
Я попробовал его выполнить с CryptoProXMLDSigRI.jar (wss4j+jcp), подставив, правда, вместо случ. последовательностей CertId, KeyId, StrId... ваши из документа для проверки хэша, но получил документ без transform. Чтобы алгоритм transform добавился (Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"), нужно открыть строку
...
transformList, null, null);

да, прощу прощения. transformlist для данного примера раскомментирован.
Просто на jre6 он вставляет namespaces в каждый тег xml. на jre7 - все ок (пример xml - с jre7). Это обсуждалось в другой ветке данного форума, но решения пока нет.
Offline Евгений Афанасьев  
#4 Оставлено : 23 апреля 2012 г. 15:30:41(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Постараемся сегодня выложить новую версию. Проблема в xmlsec.
Offline Евгений Афанасьев  
#5 Оставлено : 23 апреля 2012 г. 17:08:23(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Скачайте http://cryptopro.ru/site...test_jcp_wss4j1_6.tar.gz
В нем есть CryptoProXMLDSigRI-1.51. К нему требуется xmlsec версии 1.5.0 (http://archive.apache.org/dist/santuario/java-library/1_5_0/).
Offline Umnix  
#6 Оставлено : 25 апреля 2012 г. 14:18:06(UTC)
Umnix

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.04.2012(UTC)
Сообщений: 4

спасибо, работает
Offline scorpio1379  
#7 Оставлено : 24 мая 2012 г. 17:32:13(UTC)
scorpio1379

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.05.2012(UTC)
Сообщений: 6
Откуда: moscow

собственно у меня та же проблема возникала. подпись есть а сервис СМЭВ не дает "добро". jdk1.7 jcp+wss4j1_6 с вашего сайта.
вот тело сообщения может подскажете куда копать ?

Код:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 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">
   <S:Header>
      <wsse:Security S:actor="http://smev.gosuslugi.ru/actors/smev">
         <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">MIIESjCCA/mgAwIBAgIKYu5plQAAAAADVTAIBgYqhQMCAgMwgYgxHjAcBgkqhkiG9w0BCQEWD29p
dEBtaW5zdnlhei5ydTELMAkGA1UEBhMCUlUxFTATBgNVBAcMDNCc0L7RgdC60LLQsDEsMCoGA1UE
Cgwj0JzQuNC90LrQvtC80YHQstGP0LfRjCDQoNC+0YHRgdC40LgxFDASBgNVBAMMC9Cj0KYg0K3Q
n18xMB4XDTEyMDMwNTEyNDgwMFoXDTEzMDMwNTEyNTcwMFowggFKMRgwFgYFKoUDZAETDTEwNDc3
MDIwMjY3MDExGDAWBggqhQMDgQMBARMKNzcxMDQ3NDM3NTGBiDCBhQYDVQQKHn4EHAQ4BD0EOARB
BEIENQRABEEEQgQyBD4AIARBBDIETwQ3BDgAIAQ4ACAEPAQwBEEEQQQ+BDIESwRFACAEOgQ+BDwE
PARDBD0EOAQ6BDAERgQ4BDkAIAQgBD4EQQRBBDgEOQRBBDoEPgQ5ACAEJAQ1BDQENQRABDAERgQ4
BDgxgYgwgYUGA1UEAx5+BBgEIQAgBEMERwQ1BEIEMAAgBDgEPQREAC4AIARBBDgEQQRCAC4ALAAg
BEAEMAQ3BEAEMAQxAC4AIAQ4ACAEPwRABDUEPgQxBEAENQRCAC4AIAQ3BDAAIARBBEcENQRCACAE
MQROBDQENgQ1BEIEPQQ+BDkAIARBBDgEQQRCMGMwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwIC
HgEDQwAEQPkviS4FSuEgAt12nVlArGeGV9Sh+KZXaYlnnFATzgw46QrLXr/qJo9J6AzNF9QzSZ/s
aDX19Y61CElNFvG/IHqjggF8MIIBeDAOBgNVHQ8BAf8EBAMCBPAwGQYJKoZIhvcNAQkPBAwwCjAI
BgYqhQMCAhUwJAYDVR0lBB0wGwYGKoUDZAICBgcqhQMCAiIGBggrBgEFBQcDAjAdBgNVHQ4EFgQU
xtgJnPK/BiGvMv7KzZGCkFjhEgQwHwYDVR0jBBgwFoAUPuYfopeRxqATWv19BpNnB14828UwZgYD
VR0fBF8wXTBboFmgV4YoaHR0cDovL21vc2Nvdy5ydC5ydS9kb3dubG9hZC9jYV9lcF8xLmNybIYr
aHR0cDovL3N0YXRpYy5nb3N1c2x1Z2kucnUvY2VydC9jYV9lcF8xLmNybDB9BggrBgEFBQcBAQRx
MG8wNAYIKwYBBQUHMAKGKGh0dHA6Ly9tb3Njb3cucnQucnUvZG93bmxvYWQvY2FfZXBfMS5jcnQw
NwYIKwYBBQUHMAKGK2h0dHA6Ly9zdGF0aWMuZ29zdXNsdWdpLnJ1L2NlcnQvY2FfZXBfMS5jcnQw
CAYGKoUDAgIDA0EAB6EFMSNsI20QB674kV0/luOoKNGiuGZhPemWOPmkEPYV/joizAqFqTOhxuiO
DrZQvJ9uJmsSEi/+QzMTf1iFFA==</wsse:BinarySecurityToken>
         <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
            <SignedInfo>
               <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
               <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
               <Reference URI="#body">
                  <Transforms>
                     <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                  </Transforms>
                  <DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
                  <DigestValue>B1kRkQthuNJmF31z3+nypj1CPE8E8O46G+bHnYJFjoo=</DigestValue>
               </Reference>
            </SignedInfo>
            <SignatureValue>g3ManeQzh0MRDYa32Byzbjq8BGBFn6ppSAzgfTDDYDSY2NPwJgEQecWRZwbbW/QCa0NY1cQjLnYv
0SMdz1KENA==</SignatureValue>
            <KeyInfo>
               <wsse:SecurityTokenReference>
                  <wsse:Reference URI="#CertId" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
               </wsse:SecurityTokenReference>
            </KeyInfo>
         </Signature>
      </wsse:Security>
      <Header xmlns="http://smev.gosuslugi.ru/rev111111" xmlns:ns2="http://output.azws.iteco.ru" xmlns:ns3="http://www.w3.org/2004/08/xop/include">
         <NodeId>NodeId</NodeId>
         <TimeStamp>2012-05-24T13:55:56.916+04:00</TimeStamp>
         <MessageClass>RESPONSE</MessageClass>
      </Header>
   </S:Header>
   <S:Body wsu:Id="body">
      <ns2:AssetReturn xmlns="http://smev.gosuslugi.ru/rev111111" xmlns:ns2="http://output.azws.iteco.ru" xmlns:ns3="http://www.w3.org/2004/08/xop/include">
         <Message>
            <Sender/>
            <Recipient>
               <Code>?</Code>
               <Name>?</Name>
            </Recipient>
            <TypeCode>GSRV</TypeCode>
            <Status>RESULT</Status>
            <Date>2012-05-24T13:55:56.915+04:00</Date>
            <TestMsg>?</TestMsg>
         </Message>
         <MessageData>
            <AppData>
               <ns2:XMLData>testmsg</ns2:XMLData>
            </AppData>
         </MessageData>
      </ns2:AssetReturn>
   </S:Body>
</S:Envelope>


вот код метода
Код:
		if (mf == null)
			return;
		// Prepare secured header
		mf.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
		mf.getSOAPPart().getEnvelope().addNamespaceDeclaration("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
		mf.getSOAPPart().getEnvelope().addNamespaceDeclaration("ds", "http://www.w3.org/2000/09/xmldsig#");
		mf.getSOAPBody().setAttributeNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "wsu:Id","body");
		
		WSSecHeader header = new WSSecHeader();
		header.setActor("http://smev.gosuslugi.ru/actors/smev");
		header.setMustUnderstand(false);
		
		Element sec = header.insertSecurityHeader(mf.getSOAPPart());
		Document doc = mf.getSOAPPart().getEnvelope().getOwnerDocument();
		
                
                
		Element token =(Element) sec.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:BinarySecurityToken")); 
		token.setAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
		token.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
		token.setAttribute("wsu:Id", "CertId");
		header.getSecurityHeader().appendChild(token);
		
		// Prepare signature provider
                xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();
                setSAMdata(null, ru.utility.SpecUtility.DEFAULT_PASSWORD, ru.utility.SpecUtility.DEFAULT_ALIAS, ru.utility.SpecUtility.DEFAULT_PASSWORD);
		final Transforms transforms = new Transforms(doc);
                XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);


                
                List<Transform> transformList = new ArrayList<Transform>();
        Transform transformC14N = fac.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null);
        transformList.add(transformC14N);
                
                
		//Reference ref = fac.newReference("#body", fac.newDigestMethod("http://www.w3.org/2001/04/xmldsig-more#gostr3411", null));
                Reference ref = fac.newReference("#body", fac.newDigestMethod("http://www.w3.org/2001/04/xmldsig-more#gostr3411", null),
           //     null,null,null );
                 transformList, null,null );
                
		// Make link to signing element
		SignedInfo si = fac.newSignedInfo( fac.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE, 
				 								(C14NMethodParameterSpec) null),
                                                 
				 						   fac.newSignatureMethod("http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411", null),
				 						   		Collections.singletonList(ref));
		
		
		
  //              transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);

                
		// Prepare key information to verify signature in future on other side
		final Object[] obj = samData.clone();
                KeyInfoFactory kif = fac.getKeyInfoFactory();
		X509Data x509d = kif.newX509Data(Collections.singletonList((X509Certificate) obj[0]));
		KeyInfo ki = kif.newKeyInfo(Collections.singletonList(x509d));
		
		// Create signature and sign by private key
		javax.xml.crypto.dsig.XMLSignature sig = fac.newXMLSignature(si, ki);
		DOMSignContext signContext = new DOMSignContext((Key) obj[1], token);
		sig.sign(signContext);
		
		// Insert signature node in document
		Element sigE = (Element) XPathAPI.selectSingleNode(signContext.getParent(), "//ds:Signature");
		Node keyE = XPathAPI.selectSingleNode(sigE, "//ds:KeyInfo", sigE);
		token.appendChild(doc.createTextNode(XPathAPI.selectSingleNode(keyE, "//ds:X509Certificate", keyE).getFirstChild().getNodeValue()));
		keyE.removeChild(XPathAPI.selectSingleNode(keyE, "//ds:X509Data", keyE));
		NodeList chl = keyE.getChildNodes();
		
		for (int i = 0; i < chl.getLength(); i++) {
			keyE.removeChild(chl.item(i));
		}
		
		Node str = keyE.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:SecurityTokenReference"));
		Element strRef = (Element)str.appendChild(doc.createElementNS("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Reference"));
		
		strRef.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3");
		strRef.setAttribute("URI", "#CertId");
		header.getSecurityHeader().appendChild(sigE);
	}


и еще один вопрос вдогонку если использовать просто transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
как в оригинале jcp+wss4j1_6 то сам тэг transform вообще не появляется в исходящем сообщении. это так и должно быть ?
Offline Евгений Афанасьев  
#8 Оставлено : 26 мая 2012 г. 14:29:37(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Здравствуйте.
Вы не могли бы поподробнее написать, какую ошибку вам возвращает сервис СМЭВ?
У меня этот код работает - проверяется подпись 1) своими средствами, что в примере, и 2) http://188.254.16.92:7777/gateway/services/SID0003038 возвращает код ошибки 0.
Если отключаю transformList, то возвращает 1 (внутренняя ошибка сервиса).
Transforms transforms = new Transforms(doc); выполняется над документом, а transformC14N -надо блоком SignedInfo.
Offline scorpio1379  
#9 Оставлено : 28 мая 2012 г. 18:35:56(UTC)
scorpio1379

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.05.2012(UTC)
Сообщений: 6
Откуда: moscow

Код:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Header/>
   <env:Body>
      <ns1:VerifySignatureResponse xmlns:ns2="http://idecs.nvg.ru/identityservice/ws/types/" xmlns:ns1="http://smev.gosuslugi.ru/SignatureTool/xsd/">
         <error>
            <ns2:errorCode>3</ns2:errorCode>
            <ns2:errorMessage>Неверная ЭП сообщения</ns2:errorMessage>
         </error>
      </ns1:VerifySignatureResponse>
   </env:Body>
</env:Envelope>

вот ответ СМЭВ. для проверки использую SOAPUI.

Проверка подписи своими средствами - это имеется ввиду метод verifySecuredMessage ?
он и у меня проходит, но тут вопросов нет - подпись проверяется в том же модуле где и подписывается, в Handler - ре.

убирал transform - тот же ответ. внутренней ошибки не добился.

так те мне нужно сначала выполнить transformC14N а потом
Transforms transforms = new Transforms(doc);
transforms.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
блин совсем запутался я :( когда и в каком порядке следует вызывать эти transform и transformS?

и еще натолкнулся на ошибку a system level error occurred while verifying trust
тут она описывалась до для CSP - решил проблему (если это проблема) установкой CSP с пакетом совместимости с windows
только я так и не понял - JCP надо ставить поверх CSP ?
Offline Евгений Афанасьев  
#10 Оставлено : 28 мая 2012 г. 21:56:04(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Да, я имел в виду проверку функциями примера (у вас проверяется).
Над документом я не выполнял преобразований, только transformC14N.
JCP независимый продукт.
По идее, вы можете для проверки этого примера не использовать CSP.
Я скопировал ваш пример, составил исходное сообщение в виде
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body Id="body">
<ns2:AssetReturn xmlns="http://smev.gosuslugi.ru/rev111111" xmlns:ns2="http://output.azws.iteco.ru" xmlns:ns3="http://www.w3.org/2004/08/xop/include">
<Message>
<Sender />
<Recipient>
<Code>?</Code>
<Name>?</Name>
</Recipient>
<TypeCode>GSRV</TypeCode>
<Status>RESULT</Status>
<Date>2012-05-24T13:55:56.915+04:00</Date>
<TestMsg>?</TestMsg>
</Message>
<MessageData>
<AppData>
<ns2:XMLData>testmsg</ns2:XMLData>
</AppData>
</MessageData>
</ns2:AssetReturn>
</S:Body>
</S:Envelope>
У меня он подписался и проверился СМЭВ по указанному мной адресу.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.