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

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

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

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

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

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

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

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

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

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

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

Ранее для идентификации российских алгоритмов внутри 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.

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

См. также