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

Основное отличие данного примера от примера с одной подписью в другом transform, который выделяет для подписи узлы, не включая в них все подписи, а не только проверяемую.

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

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

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

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

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

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

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

Перед запуском примера необходимо иметь два или более секретных ключа и соответствующие им сертификаты. Сертификаты должны быть установлены в хранилище MY со ссылкой на соответствующий секретный ключ. В ходе работы пример создает два файла doc_to_sign2.xml и doc_signed2.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.

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

См. также