Требуется сформировать сообщение вида:
Код:
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 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">
<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="#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>zUD8qqNPFeD/DbQ9Uu5q8NvdqW908iHmukyhS17U+UA=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
y/YwuY7WCmt/ud197st+UUMi18X6RKtuQRlP4ClYHn/d8bAF4m/H4A2CupgM0ABpEsrqZf8EFRYh
08lAfSj2wQ==
</ds:SignatureValue>
<ds:KeyInfo>
<wsse:SecurityTokenReference>
<wsse:Reference URI="#FNSCertificate" />
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
<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="FNSCertificate">
MIIDbzCCAx6gAwIBAgIKT0n0JwAAAAACbzAIBgYqhQMCAgMweTEXMBUGCSqGSIb3DQEJARYIY2FA
cnQucnUxCzAJBgNVBAYTAlJVMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAxJDAiBgNVBAoMG9Ce0JDQ
niDQoNC+0YHRgtC10LvQtdC60L7QvDEUMBIGA1UEAxMLUlRLIFRlc3QgQ0EwHhcNMTEwNzE0MTEx
MzAwWhcNMTIwNzE0MTEyMjAwWjBSMQswCQYDVQQGEwJSVTFDMEEGA1UEAx46BCIENQRBBEIEPgQy
BEsEOQAgBEEENQRABEIEOAREBDgEOgQwBEIAIAQkBB0EIQAgBC0EHwAtBB4EEjBjMBwGBiqFAwIC
EzASBgcqhQMCAiQABgcqhQMCAh4BA0MABEBoEKpxwOzL7/rR/NzVm6UKW1IUROTXkzzx587jlJPf
Qa3PdOMhSVlEZcwEL9+qcJBFkszomWQ+rXmqcCFAHS2+o4IBqzCCAacwCwYDVR0PBAQDAgTwMCYG
A1UdJQQfMB0GByqFAwICIgYGCCsGAQUFBwMCBggrBgEFBQcDBDAdBgNVHQ4EFgQUxpxy+ssufWhK
y2NS1P/bqZchrGowHwYDVR0jBBgwFoAU3FNp0mLQ2/bwWr2CT1PAxNXwP1cwZgYDVR0fBF8wXTBb
oFmgV4ZVaHR0cDovL2QwMHBndWNlcnQwMS4wMC5lZ292LmxvY2FsL3JhL2NkcC9kYzUzNjlkMjYy
ZDBkYmY2ZjA1YWJkODI0ZjUzYzBjNGQ1ZjAzZjU3LmNybDCBkwYIKwYBBQUHAQEEgYYwgYMwOwYI
KwYBBQUHMAGGL2h0dHA6Ly9kMDBwZ3VjZXJ0MDEuMDAuZWdvdi5sb2NhbC9vY3NwL29jc3Auc3Jm
MEQGCCsGAQUFBzAChjhodHRwOi8vZDAwcGd1Y2VydDAxLjAwLmVnb3YubG9jYWwvcmEvY2RwL3Rl
c3RfY2FfcnRrLmNydDAyBgkrBgEEAYI3FQoEJTAjMAkGByqFAwICIgYwCgYIKwYBBQUHAwIwCgYI
KwYBBQUHAwQwCAYGKoUDAgIDA0EAYEEdhOpMor9QE22T4hUP1jJVnZ9aA0XgsxsjBzjhzfMwAI4g
L2YgBUvKQNa+iWVyg8u+BHHGCrVF9GyGXQIuzA==
</wsse:BinarySecurityToken>
</wsse:Security>
</S:Header>
<S:Body wsu:Id="body">
<ws:queryINNFLResponse xmlns:ws="http://ws.unisoft/" xmlns:xml="http://www.w3.org/XML/1998/namespace">
<smev:Message xmlns:smev="http://smev.gosuslugi.ru/rev110801">
<smev:Sender>
<smev:Code>13312</smev:Code>
<smev:Name>ФНС</smev:Name>
</smev:Sender>
<smev:Recipient>
<smev:Code>MINECONOMSK_SYS_1</smev:Code>
<smev:Name>Минэкономразвития СК</smev:Name>
</smev:Recipient>
<smev:Originator>
<smev:Code>MINECONOMSK_SYS_1</smev:Code>
<smev:Name>Минэкономразвития СК</smev:Name>
</smev:Originator>
<smev:TypeCode>6</smev:TypeCode>
<smev:Date>2012-03-27T09:22:53Z</smev:Date>
</smev:Message>
<smev:MessageData xmlns:smev="http://smev.gosuslugi.ru/rev110801">
<smev:AppData wsu:Id="fns-AppData">
<smev:return>520205004556</smev:return>
</smev:AppData>
</smev:MessageData>
</ws:queryINNFLResponse>
</S:Body>
</S:Envelope>
Средствами КриптоПро ЭЦП Browser plug-in заполним содержимое узлов <ds:DigestValue> и <ds:SignatureValue>.
Формирование документа выносим за рамки обсуждения (можно через MSXML, JavaScript XML DOM, jQuery и т.п.)
Формирование XMLDSIG
enveloping подписи для узла <S:Body>:
0. Считаем, что документ уже сформирован. Шаблон подписи вставлен в документ.
<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="#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></ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue></ds:SignatureValue>
<ds:KeyInfo>
<wsse:SecurityTokenReference>
<wsse:Reference URI="#FNSCertificate" />
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
Ссылки на подписываемые узла проставлены, идентификаторы алгоритмов заданы, ссылка на
сертификат подписи задана.
1. Каноникализируем узел <S:Body>. C = C14n(T) (алгоритм опишем ниже)
2. Считаем хэш от полученного результата. m = Hash(C)
3. Помещаем полученное значени хэша (в кодировке Base64) в <DigestValue> узла <ds:Reference URI="#body">
4. Каноникализируем узел <ds:SignedInfo>
5. Подписываем полученное в п.4 значение SV = Sign(Ks, SI)
6. Значение подписи (в кодировке Base64) помещаем в узел <ds:SignatureValue>
Каноникализация
C14N1. Документ кодируем в UTF-8
2. Все разрывы строк заменаем на #xA
3. Раскрываем пустые узлы: <node/> -> <node></node>
4. Все пробелы, табуляцию между узлами сохраняем.
5. Пробелы внутри тегов нормализуем.
<node a = 'a1' b=b1
c = "c1" >
становится
<node a = 'a1' b=b1 c="c1">
6. Спец символы в текстовом содержимом узлов экранируем:
(&) -> &
(<) -> <
(>) -> >
(") -> "
(') -> &apos
Проставление атрибутов по умолчанию, пространств имен, [CDATA], DTD и т.п. оставляем за рамками обсуждения.
В качестве эталона можно взять
XmlDsigExcC14NTransform из .NET.
Отредактировано пользователем 18 апреля 2013 г. 9:32:12(UTC)
| Причина: Не указана