Данный пример создает 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 Code |
---|---|
signedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410Url; |
Visual Basic | Copy Code |
---|---|
signedXml.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410Url |
и заменить алгоритм подписи на XmlDsigGost3410UrlObsolete.
Код проверки подписи корректно проверяет подпись (без модификации) как в старом так и в новом пространствах имен.