Требуется сформировать сообщение вида:
Средствами КриптоПро ЭЦП 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.
Отредактировано пользователем 12 лет назад
| Причина: Не указана