Данный пример создает XML документ, сохраняет документ в файле to_sign.xml, подписывает узел документа с @Id='#obj', сохраняет созданную подпись внутри документа и записывает документ в файл signed_on_key.xml. В примере осуществляется проверка подписи под в созданном документе. Хэширование узла документа осуществляется на алгоритме ГОСТ Р 34.11, подпись на алгоритме ГОСТ Р 34.10. Данный пример не использует сертификаты.

Демонстрирует

Данный пример демонстрирует использование методов класса SignedXml без использования сертификатов.

Исходные тексты

Исходные тексты примера запакованы в файле Simple.zip. C# версия находится в файле xml\cs\SignOnKey.cs, Visual Basic версия находится в файле xml\vb\SignOnKey.vb. Подробнее см. Сборка, запуск и местоположение простейших криптографических примеров.

Как собрать пример

Процесс сборки требует указания дополнительных сборок CryptoPro.Sharpei.Xml.dll, System.Security.dll Побробнее см. Сборка, запуск и местоположение простейших криптографических примеров.

Как запустить пример

Перед запуском примера необходимо иметь контейнер с секретным ключем. В ходе работы пример создает два файла to_sign.xml и signed_on_key.xml, если файлы уже существует они будут перезаписаны.

Для запуска примера необходимо передать имя контейнера секретного ключа. Побробнее о возможных вариантах запуска см. Сборка, запуск и местоположение простейших криптографических примеров.

Как изменить пример для совместимости.

Ранее для идентификации российских алгоритмов внутри XML подписи и хэширования использовались другие пространства имен. Для алгоритма хэширования использовалось пространство имен http://www.w3.org/2001/04/xmldsig-more#gostr3411, а для алгоритма подписи http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411. Эти пространства имен использовались в КриптоПро CSP 2.0, 3.0, 3.6 и ранних версиях КриптоПро JCP. Эти пространства имен устарели и их не рекомендуется использовать, но данный пример можно модифицировать для поддержания режима совместимости со старыми пространствами имен.

Для подписания в примере необходимо в ссылке на подписываемый узел (Reference) алгоритм хэширования CPSignedXml.XmlDsigGost3411Url заменить на CPSignedXml.XmlDsigGost3411UrlObsolete. Так же при подписании необходимо явно указывать алгоритм подписи, для этого необходимо расскоментировать строку

C# Copy imageCopy Code
signedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410Url;
Visual Basic Copy imageCopy Code
signedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410Url

и заменить алгоритм подписи на XmlDsigGost3410UrlObsolete.

Код проверки подписи корректно проверяет подпись (без модификации) как в старом так и в новом пространствах имен.

См. также