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

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

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

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

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

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

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

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

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

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

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

См. также