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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline t1nk  
#1 Оставлено : 16 сентября 2016 г. 14:28:38(UTC)
t1nk

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

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

Сказал(а) «Спасибо»: 7 раз
Здравствуйте!

Делаю подпись XML для СМЭВ 2 согласно статьи Подпись сообщений SOAP для СМЭВ с использованием КриптоПро JCP следующим кодом:
Код:
KeyStore keyStore = KeyStore.getInstance( "HDImageStore" );
keyStore.load( null, null );
PrivateKey privateKey = (PrivateKey) keyStore.getKey( "cpstestcon", "12345678".toCharArray() );
X509Certificate certificate = (X509Certificate) keyStore.getCertificate( "cpstestcon" );

// Подготовка сообщения.
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage message = mf.createMessage();
SOAPPart soapPart = message.getSOAPPart();

String fileName = "d:/file.xml"
InputStream src = new ByteArrayInputStream( binaryReadFile( fileName ) );
soapPart.setContent( new StreamSource( src ) );

message.getSOAPPart().getEnvelope().addNamespaceDeclaration( "ds", "http://www.w3.org/2000/09/xmldsig#" );
Document doc = message.getSOAPPart().getEnvelope().getOwnerDocument();

// Добавляем заголовки для помещения информации о подписи.
WSSecHeader header = new WSSecHeader();
header.setActor( "http://smev.gosuslugi.ru/actors/smev" );
header.setMustUnderstand( false );
header.insertSecurityHeader( message.getSOAPPart().getEnvelope().getOwnerDocument() );
// Элемент подписи.
Element token = header.getSecurityHeader();

// Загрузка провайдера.
Provider xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();

// Добавляем описание преобразований над документом и узлом SignedInfo согласно методическим рекомендациям СМЭВ.
// К каноническому виду приводим с помощью алгоритма http://www.w3.org/2001/10/xml-exc-c14n#
final Transforms transforms = new Transforms( doc );
transforms.addTransform( Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS );
XMLSignatureFactory fac = XMLSignatureFactory.getInstance( "DOM", xmlDSigProvider );

// Преобразования над узлом ds:SignedInfo
List<Transform> transformList = new ArrayList<Transform>();
Transform transformC14N = fac.newTransform( Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, (XMLStructure) null );
transformList.add( transformC14N );

// Ссылка на подписываемый узел с заданными идентификатором с алгоритмом хеширования ГОСТ 34.11-94.
Reference ref = fac.newReference(
        "#body",
        fac.newDigestMethod( "http://www.w3.org/2001/04/xmldsig-more#gostr3411", null ),
        transformList,
        null,
        null
);

// Задаём алгоритм подписи ГОСТ Р 34.10-2001.
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 )
);

// Создаём узел ds:KeyInfo с информацией о сертификате
KeyInfoFactory kif = fac.getKeyInfoFactory();
X509Data x509d = kif.newX509Data( Collections.singletonList( certificate ) );
KeyInfo ki = kif.newKeyInfo( Collections.singletonList( x509d ) );

// Подписываем данные в элементе token
javax.xml.crypto.dsig.XMLSignature sig = fac.newXMLSignature( si, ki );
DOMSignContext signContext = new DOMSignContext( privateKey, token );
sig.sign( signContext );

// Узел подписи Signature.
Element sigE = (Element) XPathAPI.selectSingleNode( signContext.getParent(), "//ds:Signature" );
// Блок данных KeyInfo.
Node keyE = XPathAPI.selectSingleNode( sigE, "//ds:KeyInfo", sigE );
// Элемент SenderCertificate, который должен содержать сертификат.
Element cerVal = (Element) XPathAPI.selectSingleNode( token, "//*[@wsu:Id='SenderCertificate']" );
cerVal.setTextContent( XPathAPI.selectSingleNode( keyE, "//ds:X509Certificate", keyE ).getFirstChild().getNodeValue() );
// Удаляем содержимое KeyInfo
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 ) );
}
// Узел KeyInfo содержит указание на проверку подписи с помощью сертификата SenderCertificate.
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", "#SenderCertificate" );
header.getSecurityHeader().appendChild( sigE );

FileOutputStream output = new FileOutputStream( fileName + ".sgn" );
message.writeTo( output );


Но Сервис проверки подписи говорит "Неверная ЭП сообщения", и при подписи вашим тестовым ключом, и специально приобретенным ключом.

Если через JCP делать проверку подписанной XML, то проверка проходит, что логично - сам подписал, сам же и подтвердил корректность...

Вот подписанная XML:
Код:
<env:Envelope xmlns:env="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">
<env:Header>
<wsse:Security env: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="SenderCertificate">MIIJcjCCCSGgAwIBAgIKFhak+gAAAAAe9zAIBgYqhQMCAgMwggGyMRgwFgYFKoUDZAESDTEwMjMx
MDE2NzA0MzcxGjAYBggqhQMDgQMBARIMMDAzMTIzMDc3MTExMSUwIwYJKoZIhvcNAQkBFhZzZXJ2
aWNldWNAYmVscmVnaW9uLnJ1MQswCQYDVQQGEwJSVTEgMB4GA1UECQwX0J3QtdC60YDQsNGB0L7Q
stCwIDktMTUxMzAxBgNVBAgMKjMxINCR0LXQu9Cz0L7RgNC+0LTRgdC60LDRjyDQvtCx0LvQsNGB
0YLRjDEZMBcGA1UEBwwQ0JHQtdC70LPQvtGA0L7QtDFQME4GA1UECgxH0J7Qk9CR0KMg0JHQtdC7
0LPQvtGA0L7QtNGB0LrQuNC5INC40L3RhNC+0YDQvNCw0YbQuNC+0L3QvdGL0Lkg0YTQvtC90LQx
MDAuBgNVBAsMJ9Cj0LTQvtGB0YLQvtCy0LXRgNGP0Y7RidC40Lkg0YbQtdC90YLRgDFQME4GA1UE
AwxH0KPQpiDQkNC00LzQuNC90LjRgdGC0YDQsNGG0LjQuCDQkdC10LvQs9C+0YDQvtC00YHQutC+
0Lkg0L7QsdC70LDRgdGC0LgwHhcNMTYwOTAyMTA0OTAwWhcNMTcwOTAyMTA1MDAwWjCCAS0xGDAW
BgUqhQNkARINMTAyMzEwMTY1MTg3MDEaMBgGCCqFAwOBAwEBEgwwMDMxMjMwNTUyNjAxGjAYBgkq
hkiG9w0BCQEWC2Nwc0AxY3BzLnJ1MQswCQYDVQQGEwJSVTE3MDUGA1UECB4uADMAMQAgBBEENQQ7
BDMEPgRABD4ENARBBDoEMARPACAEPgQxBDsEMARBBEIETDEZMBcGA1UEBx4QBBEENQQ7BDMEPgRA
BD4ENDE7MDkGA1UECh4yBB4EHgQeACAAJwQmBDUEPQRCBEAEPwRABD4EMwRABDAEPAQ8BEEEOARB
BEIENQQ8ACcxOzA5BgNVBAMeMgQeBB4EHgAgACcEJgQ1BD0EQgRABD8EQAQ+BDMEQAQwBDwEPARB
BDgEQQRCBDUEPAAnMGMwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEDQwAEQNOM56rwa2jd
/y07bwLYJG1hphcWCORlaC4T6QhrkbEvpOkazxcU7v2NhzFe2cMlldEHNX75kUdhpAZQuTXc1PWj
ggWWMIIFkjAOBgNVHQ8BAf8EBAMCBPAwGQYJKoZIhvcNAQkPBAwwCjAIBgYqhQMCAhUwNwYDVR0l
BDAwLgYGKoUDZAICBgcqhQMCAiIZBgcqhQMCAiIGBggrBgEFBQcDAgYIKwYBBQUHAwQwHQYDVR0O
BBYEFNg26xpmLhcjn/U+81hSp5g0NAEPMIIB8wYDVR0jBIIB6jCCAeaAFH22gVr6/kgqmyQcsySr
YItGh69goYIBuqSCAbYwggGyMRgwFgYFKoUDZAESDTEwMjMxMDE2NzA0MzcxGjAYBggqhQMDgQMB
ARIMMDAzMTIzMDc3MTExMSUwIwYJKoZIhvcNAQkBFhZzZXJ2aWNldWNAYmVscmVnaW9uLnJ1MQsw
CQYDVQQGEwJSVTEgMB4GA1UECQwX0J3QtdC60YDQsNGB0L7QstCwIDktMTUxMzAxBgNVBAgMKjMx
INCR0LXQu9Cz0L7RgNC+0LTRgdC60LDRjyDQvtCx0LvQsNGB0YLRjDEZMBcGA1UEBwwQ0JHQtdC7
0LPQvtGA0L7QtDFQME4GA1UECgxH0J7Qk9CR0KMg0JHQtdC70LPQvtGA0L7QtNGB0LrQuNC5INC4
0L3RhNC+0YDQvNCw0YbQuNC+0L3QvdGL0Lkg0YTQvtC90LQxMDAuBgNVBAsMJ9Cj0LTQvtGB0YLQ
vtCy0LXRgNGP0Y7RidC40Lkg0YbQtdC90YLRgDFQME4GA1UEAwxH0KPQpiDQkNC00LzQuNC90LjR
gdGC0YDQsNGG0LjQuCDQkdC10LvQs9C+0YDQvtC00YHQutC+0Lkg0L7QsdC70LDRgdGC0LiCEEhw
rmfjj5GpREU2Xl7ZwykwgbEGA1UdHwSBqTCBpjBSoFCgToZMaHR0cDovL3VjYm8uYmVscmVnaW9u
LnJ1L2NhL2NkcC83ZGI2ODE1YWZhZmU0ODJhOWIyNDFjYjMyNGFiNjA4YjQ2ODdhZjYwLmNybDBQ
oE6gTIZKaHR0cDovL3VjLmJlbHJlZ2lvbi5ydS9jYS9jZHAvN2RiNjgxNWFmYWZlNDgyYTliMjQx
Y2IzMjRhYjYwOGI0Njg3YWY2MC5jcmwwgawGCCsGAQUFBwEBBIGfMIGcMDIGCCsGAQUFBzABhiZo
dHRwOi8vdWNiby5iZWxyZWdpb24ucnUvb2NzcC9vY3NwLnNyZjA0BggrBgEFBQcwAoYoaHR0cDov
L3VjYm8uYmVscmVnaW9uLnJ1L2NhL2NkcC9yb290LmNydDAwBggrBgEFBQcwAoYkaHR0cDovL3Vj
Ym8uYmVscmVnaW9uLnJ1L3RzcC90c3Auc3JmMDQGBSqFA2RvBCsMKdCa0YDQuNC/0YLQvtCf0YDQ
viBDU1AgKNCy0LXRgNGB0LjRjyAzLjYpMB0GA1UdIAQWMBQwCAYGKoUDZHEBMAgGBiqFA2RxAjAr
BgNVHRAEJDAigA8yMDE2MDkwMjEwNDkwMFqBDzIwMTcwOTAyMTA0OTAwWjCCAS8GBSqFA2RwBIIB
JDCCASAMKdCa0YDQuNC/0YLQvtCf0YDQviBDU1AgKNCy0LXRgNGB0LjRjyAzLjYpDFLQo9C00L7R
gdGC0L7QstC10YDRj9GO0YnQuNC5INGG0LXQvdGC0YAgItCa0YDQuNC/0YLQvtCf0YDQviDQo9Cm
IiDQstC10YDRgdC40LggMS41DE/QodC10YDRgtC40YTQuNC60LDRgiDRgdC+0L7RgtCy0LXRgtGB
0YLQstC40Y8g4oSWINCh0KQvMTI0LTIyMzgg0L7RgiAwNC4xMC4yMDEzDE5D0LXRgNGC0LjRhNC4
0LrQsNGCINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyDihJYg0KHQpC8xMjgtMjM1MSDQvtGCIDE1
LjA0LjIwMTQwCAYGKoUDAgIDA0EAHOgl2Sz8Yrf+Rfjz8KXi7ivprX12HqlM/7I4OQuf1SfQMn2Z
d0ZAdTyfbVFPcerC1NlZuPOMJYxxo5jtUMztpg==</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>eN0hHmnYk/AbxkyJGMrrA1iqcX5uCaunzVJby/PRAZ8=</DigestValue></Reference></SignedInfo><SignatureValue>SsdLG32j4XugurjzmpmsUVGlopxV2fAE63vr4TTMZcC7Kn/6WkNZSCv1EAHgD87/jFH0L60Kw47v
qe25LY8s9g==</SignatureValue><KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="#SenderCertificate" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></KeyInfo></Signature></wsse:Security>
</env:Header>
<env:Body wsu:id="body">
<esia:Identification xmlns:esia="http://mks.esia.rstyle.ru/" xmlns="http://smev.gosuslugi.ru/rev120315">
<Message>
<Sender>
<Code>TEST00001</Code>
<Name>Шлюз СМЭВ</Name>
</Sender>
<Recipient>
<Code>ISIA01001</Code>
<Name>Electronic system identification and authentication</Name>
</Recipient>
<Originator>
<Code>TEST00001</Code>
<Name>Шлюз СМЭВ</Name>
</Originator>
<Service>
<Mnemonic>ESIARegister</Mnemonic>
<Version>1.00</Version>
</Service>
<TypeCode>OTHR</TypeCode>
<Status>REQUEST</Status>
<Date>2016-08-02T10:37:05.059+03:00</Date>
<ExchangeType>0</ExchangeType>
<CaseNumber>Test</CaseNumber>
</Message>
<MessageData>
<AppData>
<esia:passportSeries>1111</esia:passportSeries>
<esia:passportNumber>111111</esia:passportNumber>
<esia:firstname>XXXXX</esia:firstname>
<esia:lastname>XXXXXXX</esia:lastname>
<esia:middlename>XXXXXXX</esia:middlename>
<esia:mobile>+1(111)1111111</esia:mobile>
<esia:snils>111-111-111 11</esia:snils>
<esia:inn>111111111111</esia:inn>
</AppData>
</MessageData>
</esia:Identification>
</env:Body>
</env:Envelope>


В не подписанной HEAD выглядел так:
Код:
<env:Header>
<wsse:Security env: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="SenderCertificate">
</wsse:BinarySecurityToken>
</wsse:Security>
</env:Header>


Использую JCP 2.0.38830 с xmlsec-1.5.0.jar (Правильно?)

Если код правильный чего-то не хватает в XML или что-то с подписью?
Offline PashaTurokME2019  
#2 Оставлено : 16 ноября 2019 г. 13:49:59(UTC)
PashaTurokME2019

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

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

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