Как подписать XML-файл электронной подписью

Обновлено: 21.11.2024

Эта фиксация не принадлежит ни к одной из веток в этом репозитории и может принадлежать ответвлению за пределами репозитория.

  • Открыть с рабочего стола
  • Просмотреть в необработанном виде
  • Копировать исходное содержимое Копировать необработанное содержимое

Копировать необработанное содержимое

Копировать необработанное содержимое

Как подписывать XML-документы с помощью цифровых подписей

Вы можете использовать классы в пространстве имен xref:System.Security.Cryptography.Xml для подписи XML-документа или части XML-документа цифровой подписью. Цифровые подписи XML (XMLDSIG) позволяют убедиться, что данные не были изменены после их подписания. Дополнительные сведения о стандарте XMLDSIG см. в рекомендациях Консорциума World Wide Web (W3C) Синтаксис и обработка подписи XML.

[!NOTE] Код в этой статье относится к Windows.

Пример кода в этой процедуре демонстрирует, как поставить цифровую подпись на весь XML-документ и прикрепить подпись к документу в элементе < Signature >. В примере создается ключ подписи RSA, ключ добавляется в безопасный контейнер ключей, а затем используется ключ для цифровой подписи XML-документа. Затем ключ можно получить для проверки цифровой подписи XML или использовать для подписи другого XML-документа.

Информацию о том, как проверить цифровую подпись XML, созданную с помощью этой процедуры, см. в разделе Практическое руководство. Проверка цифровых подписей XML-документов.

Чтобы подписать XML-документ цифровой подписью

Создайте объект xref:System.Security.Cryptography.CspParameters и укажите имя контейнера ключей.

Создайте асимметричный ключ с помощью класса xref:System.Security.Cryptography.RSACryptoServiceProvider. Ключ автоматически сохраняется в контейнере ключей при передаче объекта xref:System.Security.Cryptography.CspParameters конструктору класса xref:System.Security.Cryptography.RSACryptoServiceProvider. Этот ключ будет использоваться для подписи XML-документа.

Создайте объект xref:System.Xml.XmlDocument, загрузив файл XML с диска. Объект xref:System.Xml.XmlDocument содержит XML-элемент для шифрования.

Создайте новый объект xref:System.Security.Cryptography.Xml.SignedXml и передайте ему объект xref:System.Xml.XmlDocument.

Добавьте ключ RSA для подписи в объект xref:System.Security.Cryptography.Xml.SignedXml.

Создайте объект xref:System.Security.Cryptography.Xml.Reference, описывающий, что следует подписывать. Чтобы подписать весь документ, задайте для свойства xref:System.Security.Cryptography.Xml.Reference.Uri%2A значение "" .

Добавьте объект xref:System.Security.Cryptography.Xml.XmlDsigEnvelopedSignatureTransform к объекту xref:System.Security.Cryptography.Xml.Reference. Преобразование позволяет верификатору представлять XML-данные тем же способом, что и подписывающая сторона. XML-данные могут быть представлены по-разному, поэтому этот шаг крайне важен для проверки.

Добавьте объект xref:System.Security.Cryptography.Xml.Reference к объекту xref:System.Security.Cryptography.Xml.SignedXml.

Получить XML-представление подписи (элемент < Signature >) и сохранить его в новый объект xref:System.Xml.XmlElement.

Добавить элемент в объект xref:System.Xml.XmlDocument.

Сохраните документ.

В этом примере предполагается, что файл с именем test.xml существует в том же каталоге, что и скомпилированная программа. Вы можете поместить следующий XML-код в файл с именем test.xml и использовать его в этом примере.

Компиляция кода

Включите следующие пространства имен: xref:System.Xml, xref:System.Security.Cryptography и xref:System.Security.Cryptography.Xml.

Никогда не храните и не передавайте закрытый ключ пары асимметричных ключей в виде открытого текста. Дополнительные сведения о симметричных и асимметричных криптографических ключах см. в разделе Генерация ключей для шифрования и дешифрования.

Никогда не встраивайте закрытый ключ непосредственно в исходный код. Встроенные ключи можно легко прочитать из сборки с помощью Ildasm.exe (дизассемблер IL) или открыв сборку в текстовом редакторе, таком как Блокнот.

Вы можете использовать классы в пространстве имен System.Security.Cryptography.Xml для подписи XML-документа или части XML-документа цифровой подписью. Цифровые подписи XML (XMLDSIG) позволяют убедиться, что данные не были изменены после их подписания. Дополнительные сведения о стандарте XMLDSIG см. в рекомендациях Консорциума World Wide Web (W3C) Синтаксис и обработка подписи XML.

Код в этой статье относится к Windows.

Пример кода в этой процедуре демонстрирует, как поставить цифровую подпись на весь XML-документ и прикрепить подпись к документу в элементе < Signature >. В примере создается ключ подписи RSA, ключ добавляется в безопасный контейнер ключей, а затем используется ключ для цифровой подписи XML-документа.Затем ключ можно получить для проверки цифровой подписи XML или использовать для подписи другого XML-документа.

Информацию о том, как проверить цифровую подпись XML, созданную с помощью этой процедуры, см. в разделе Практическое руководство. Проверка цифровых подписей XML-документов.

Чтобы подписать XML-документ цифровой подписью

Создайте объект CspParameters и укажите имя контейнера ключей.

Создайте асимметричный ключ с помощью класса RSACryptoServiceProvider. Ключ автоматически сохраняется в контейнере ключей при передаче объекта CspParameters конструктору класса RSACryptoServiceProvider. Этот ключ будет использоваться для подписи XML-документа.

Создайте объект XmlDocument, загрузив файл XML с диска. Объект XmlDocument содержит XML-элемент для шифрования.

Создайте новый объект SignedXml и передайте ему объект XmlDocument.

Добавьте подписывающий ключ RSA в объект SignedXml.

Создайте объект Reference, описывающий, что подписывать. Чтобы подписать весь документ, задайте для свойства Uri значение "" .

Добавьте объект XmlDsigEnvelopedSignatureTransform к объекту Reference. Преобразование позволяет верификатору представлять XML-данные тем же способом, что и подписывающая сторона. XML-данные могут быть представлены по-разному, поэтому этот шаг крайне важен для проверки.

Добавьте объект Reference к объекту SignedXml.

Вычислите подпись, вызвав метод ComputeSignature.

Получить XML-представление подписи (элемент < Signature >) и сохранить его в новый объект XmlElement.

Добавить элемент в объект XmlDocument.

Сохраните документ.

Пример

В этом примере предполагается, что файл с именем test.xml существует в том же каталоге, что и скомпилированная программа. Вы можете поместить следующий XML-код в файл с именем test.xml и использовать его в этом примере.

Компиляция кода

Никогда не храните и не передавайте закрытый ключ пары асимметричных ключей в виде открытого текста. Дополнительные сведения о симметричных и асимметричных криптографических ключах см. в разделе Генерация ключей для шифрования и дешифрования.

Никогда не встраивайте закрытый ключ непосредственно в исходный код. Встроенные ключи можно легко прочитать из сборки с помощью Ildasm.exe (дизассемблер IL) или открыв сборку в текстовом редакторе, таком как Блокнот.

Код в этой статье относится к Windows.

Пример кода в этой процедуре демонстрирует, как проверить цифровую подпись XML, содержащуюся в элементе < Signature >. В этом примере открытый ключ RSA извлекается из контейнера ключей, а затем используется ключ для проверки подписи.

Информацию о том, как создать цифровую подпись, которую можно проверить с помощью этого метода, см. в разделе Практическое руководство. Подписание XML-документов с помощью цифровых подписей.

Проверка цифровой подписи XML-документа

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

Получите открытый ключ с помощью класса RSACryptoServiceProvider. Ключ автоматически загружается из контейнера ключей по имени при передаче объекта CspParameters конструктору класса RSACryptoServiceProvider.

Создайте объект XmlDocument, загрузив файл XML с диска. Объект XmlDocument содержит подписанный XML-документ для проверки.

Создайте новый объект SignedXml и передайте ему объект XmlDocument.

Найдите элемент и создайте новый объект XmlNodeList.

Загрузить XML первого элемента в объект SignedXml.

Проверьте подпись, используя метод CheckSignature и открытый ключ RSA. Этот метод возвращает логическое значение, указывающее на успех или неудачу.

Пример

В этом примере предполагается, что файл с именем "test.xml" существует в том же каталоге, что и скомпилированная программа. Файл "test.xml" должен быть подписан с использованием методов, описанных в разделе Как подписывать XML-документы с помощью цифровых подписей.

Компиляция кода

Никогда не храните и не передавайте закрытый ключ пары асимметричных ключей в виде открытого текста. Дополнительные сведения о симметричных и асимметричных криптографических ключах см. в разделе Генерация ключей для шифрования и дешифрования.

Никогда не встраивайте закрытый ключ непосредственно в исходный код. Встроенные ключи можно легко прочитать из сборки с помощью Ildasm.exe (дизассемблер IL) или открыв сборку в текстовом редакторе, таком как Блокнот.

С помощью XML ValidatorBuddy можно легко и удобно подписывать и проверять XML-документы с помощью цифровых подписей. Используйте панель инструментов в главном окне, чтобы ввести все команды, необходимые для подписи и проверки данных XML, или используйте соответствующие команды из меню XML. Вы также можете поместить сертификаты на панель инструментов "Цифровые подписи XML", чтобы быстро выбирать их, если некоторые из них нужны вам часто для подписи XML-документов или проверки существующей подписи.

На рисунке ниже показана панель инструментов XML Digital Signatures с определяемой пользователем кнопкой для быстрого выбора образца сертификата RSA SHA-2:

Откройте любой XML-документ в редакторе или выберите один или несколько XML-файлов, которые должны быть подписаны цифровой подписью, в окне проводника XML ValidatorBuddy. Все выбранные файлы будут подписаны одним и тем же сертификатом. Любая выбранная папка пропускается во время операции подписания.

Используйте команду "Подписать XML цифровой подписью" на панели инструментов или в меню XML, чтобы начать операцию подписания. Эта команда активна, когда документ загружается в редактор или если один или несколько файлов выбраны на вкладке «Проводник». Появится диалоговое окно для установки дополнительных параметров операции подписания:

Использовать сертификат

Чтобы подписать один или несколько документов, вы можете указать сертификат, который содержит закрытый ключ для операции подписания.

Кнопка выбора сертификата

Если на панели инструментов "Цифровые подписи XML" не выбран сертификат, поля в диалоговом окне для текущего активного сертификата будут пустыми. В этом случае используйте кнопку "Выбрать", чтобы выбрать сертификат.

Использовать файл или пароль

Выберите параметр «Использовать файл или пароль», чтобы прочитать ключ из внешнего файла .PFX или ввести пароль вручную в поле редактирования «Пароль:». При использовании пароля можно выбрать тип ключа и метод хеширования. Если используется файл .PFX, тип ключа и алгоритм хеширования указываются в файле. Любой требуемый пароль для доступа к ключу из файла .PFX можно ввести в поле «Пароль:».

Выберите HMAC в качестве типа ключа, если вы хотите использовать пароль для подписи XML-данных. Снова используйте поле "Пароль" для ввода пароля.

Тип ключа

Алгоритм хеширования

PFX-файл

Поле пароля

Используйте это поле, чтобы ввести пароль для подписи документа XML (для ключей HMAC) или для доступа к любому файлу PFX.

Добавить ссылки на содержимое XML

Вы также можете подписывать только части XML, если вам не нужно иметь в подписи полное содержимое XML. Используйте значения ID элементов XML, чтобы выбрать фрагменты для добавления в подпись. Вы можете добавить столько ссылок, сколько хотите, используя кнопку «Добавить». Удалите ссылку с помощью кнопки «Удалить». Если идентификатор можно найти в XML, XPath отображается в столбце «Расположение».

Преобразование контента

Вариант в конверте

Канонический вариант XML

Добавить KeyInfo с открытым ключом для проверки

К подписи можно добавить элемент KeyInfo для хранения открытого ключа. Таким образом, для последующей проверки подписи не требуется выбирать сертификат.

Добавить элемент данных X.509

Добавление элемента данных X.509 в KeyInfo, содержащего имя субъекта, имя издателя и серийный номер издателя, взятые из сертификата.

Добавить элемент KeyName

Кнопка "Подписать"

Нажмите кнопку "Подписать", чтобы добавить цифровую подпись. Если диалоговое окно подписи используется из встроенного Проводника, подписанные XML-документы сохраняются в той же папке.

Как показано в диалоговом окне, реализация DSIG XML ValidatorBuddy предлагает все важные методы и типы цифровых подписей XML.

После того как документ был подписан на вкладке "Проводник", его необходимо сохранить. Вы можете указать XML ValidatorBuddy автоматически добавлять произвольную строку в конец текущего имени файла или выбрать отображение стандартного диалогового окна для каждого подписанного файла, чтобы задать имя и место назначения нового документа. Элементы управления для выбора способа сохранения подписанных файлов находятся в нижней части диалогового окна.

При подписании активного документа новое окно, содержащее подписанный XML, открывается непосредственно в редакторе.

Вы можете использовать XML ValidatorBuddy для одновременной проверки цифровых подписей одного или нескольких файлов. Реализация также поддерживает несколько подписей в одном файле и показывает подробный отчет о результатах проверки для каждого файла отдельно:

Откройте XML-документ в редакторе или выберите один или несколько XML-файлов, которые необходимо проверить, в окне проводника XML ValidatorBuddy. Любая выбранная папка пропускается во время проверки.

Используйте команду "Проверить цифровую подпись XML" на панели инструментов или в меню XML для проверки цифровых подписей XML. Эта команда доступна, если в редакторе есть активный документ или если в проводнике выбран один или несколько файлов.

Открытый ключ для проверки подписи XML-документа берется либо из сертификата, выбранного на панели инструментов, либо, если подпись XML-документа содержит элемент KeyInfo, непосредственно из файла. Любой выбранный сертификат имеет приоритет над открытым ключом из элемента KeyInfo.

Результаты процесса проверки отображаются на стандартной панели результатов или в отдельном диалоговом окне, если на вкладке "Проводник" выбрано несколько XML-документов.

Сертификаты используются для хранения закрытых и открытых ключей для подписи и проверки XML-документов с помощью цифровых подписей.

Чтобы разместить сертификат на панели инструментов "Цифровые подписи XML" в XML ValidatorBuddy, откройте страницу "Сертификаты" в диалоговом окне "Параметры". Используйте кнопку «Новый», чтобы добавить новую строку в список сертификатов. Вы можете присвоить звание, щелкнув строку сертификата в списке. Название будет отображаться на панели инструментов для идентификации сертификата.

Для выбора сертификата используйте кнопку "Назначить сертификат". Установите флажок "Показать на панели инструментов", чтобы сертификат отображался в виде кнопки на панели инструментов "Цифровые подписи XML".

В этом разделе описывается, как добавлять цифровые подписи в XML-документы.

Возможно, будет полезно включить ведение журнала SOAP в этом пространстве имен, чтобы получать больше информации обо всех ошибках; см. “Журнал InterSystems IRIS SOAP” в “Устранение проблем SOAP в InterSystems IRIS” в разделе Создание веб-служб и веб-клиентов.

Информацию об альтернативных методах дайджеста, подписи и канонизации см. в разделе “Добавление цифровых подписей” в разделе Защита веб-служб .

Скопировать ссылку на этот раздел О документах с цифровой подписью

Документ XML с цифровой подписью включает один или несколько элементов, каждый из которых является цифровой подписью. Каждый элемент подписывает определенный элемент в документе следующим образом:

Каждый подписанный элемент имеет атрибут Id, равный некоторому уникальному значению. Например:

Элемент включает элемент, который указывает на этот идентификатор следующим образом:

Элемент подписан закрытым ключом. Этот элемент включает сертификат X.509, подписанный органом подписи. Если получатель подписанного документа доверяет этому центру подписи, получатель может затем проверить сертификат и использовать содержащийся в нем открытый ключ для проверки подписи.

InterSystems IRIS также поддерживает вариант, в котором подписанные элементы имеют атрибут с именем ID, а не Id . Дополнительную информацию см. в последнем разделе этой темы.

Ниже показан пример с добавлением пробелов для удобства чтения:

Для создания цифровых подписей используется класс %XML.Security.Signature . Это класс с поддержкой XML, проекция которого является допустимым элементом в соответствующем пространстве имен.

Скопировать ссылку на этот раздел Создание XML-документа с цифровой подписью

Чтобы создать XML-документ с цифровой подписью, используйте %XML.Writer для создания выходных данных для одного или нескольких правильно определенных объектов с поддержкой XML.

Прежде чем создавать выходные данные для объектов, необходимо создать необходимые подписи и записать их в объекты, чтобы информация была доступна для записи в место назначения.

Скопировать ссылку на этот раздел Предварительные условия для подписания

Прежде чем вы сможете подписать документ, вы должны создать хотя бы один набор учетных данных InterSystems IRIS. Набор учетных данных InterSystems IRIS — это псевдоним для следующего набора информации, хранящегося в базе данных администратора системы:

Сертификат, содержащий открытый ключ. Сертификат должен быть подписан центром подписи, которому доверяет получатель документа.

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

Для подписи необходим закрытый ключ.

(Необязательно) Пароль для закрытого ключа, который InterSystems IRIS использует при необходимости, но никогда не отправляет. Вы можете либо загрузить закрытый ключ, либо указать его во время выполнения.

Скопировать ссылку на этот раздел Требования класса с поддержкой XML

Класс с поддержкой XML должен включать следующее:

Свойство, которое проецируется как атрибут Id.

По крайней мере одно свойство типа %XML.Security.Signature, проецируемое как элемент. (Документ XML может содержать несколько элементов.)

Рассмотрите следующий класс:

Скопировать ссылку на этот раздел Создание и добавление подписи

Чтобы сгенерировать и добавить цифровую подпись, выполните следующие действия:

При необходимости включите включаемый файл %soap.inc, в котором определены макросы, которые вам могут понадобиться.

Создайте экземпляр %SYS.X509Credentials, который обращается к соответствующему набору учетных данных InterSystems IRIS. Для этого вызовите метод класса GetByAlias() для %SYS.X509Credentials .

псевдоним — это псевдоним сертификата.

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

Чтобы запустить этот метод, вы должны войти в систему как пользователь, включенный в список владельцев для этого набора учетных данных, или список владельцев должен быть нулевым. См. также “Получение набора учетных данных программным путем” в разделе Защита веб-служб .

Создайте экземпляр %XML.Security.Signature, использующий заданный набор учетных данных. Для этого вызовите метод класса CreateX509() этого класса:

credentials — это экземпляр %SYS.X509Credentials, который вы только что создали.

signatureOption равен $$$SOAPWSIncludeNone (есть и другие параметры, но они не применяются в данном сценарии)

referenceOption указывает характер ссылки на подписанный элемент. Допустимые значения см. в разделе “Справочные параметры для сертификатов X.509” в разделе Защита веб-служб .

Используемые здесь макросы определены во включаемом файле %soap.inc.

Получить значение атрибута Id для идентификатора, на который будет указывать эта подпись.

Эта информация зависит от определения вашего объекта с поддержкой XML.

Создайте экземпляр %XML.Security.Reference, чтобы указать на этот идентификатор. Для этого вызовите метод класса Create() этого класса:

id — это идентификатор, на который должна указывать эта ссылка.

алгоритм должен быть одним из следующих:

$$$SOAPWSEnvelopedSignature_","_$$$SOAPWSexcc14n — используйте эту версию для эксклюзивной канонизации.

$$$SOAPWSEnvelopedSignature — эквивалентен предыдущему варианту.

$$$SOAPWSEnvelopedSignature_","_$$$SOAPWSexcc14n — используйте эту версию для инклюзивной канонизации.

Обновите соответствующее свойство вашего класса с поддержкой XML, чтобы оно содержало подпись.

Эта деталь зависит от вашего класса с поддержкой XML. Например:

Создайте экземпляр %XML.Document, содержащий объект с поддержкой XML, сериализованный как XML.

Это необходимо, поскольку подпись должна включать информацию о подписанном документе.

Этот документ не содержит пробелов.

Вызовите метод SignDocument() вашего объекта подписи:

Аргументом для этого метода является экземпляр %XML.Document, который вы только что создали. Метод SignDocument() использует информацию из этого экземпляра для обновления объекта подписи.

Вывод должен включать те же пробелы (или отсутствие пробелов), что и документ, используемый в подписи. Подпись содержит дайджест документа, а дайджест не будет соответствовать документу, если вы установите для свойства Indent значение 1 в модуле записи.

Предыдущий метод экземпляра использует следующий универсальный метод класса, который можно использовать с любым объектом с поддержкой XML:

Скопировать ссылку на этот раздел Вариант: цифровая подпись с URI="" в ссылке

В качестве варианта элемент для подписи может иметь URI="" , который является ссылкой на корневой узел XML-документа, содержащего подпись. Чтобы создать цифровую подпись таким образом:

При необходимости включите включаемый файл %soap.inc, в котором определены макросы, которые вам могут понадобиться.

Создайте экземпляр %SYS.X509Credentials, который обращается к соответствующему набору учетных данных InterSystems IRIS. Для этого вызовите метод класса GetByAlias() для %SYS.X509Credentials , как описано в предыдущих шагах.

Создайте экземпляр %XML.Security.Signature, использующий заданный набор учетных данных. Для этого вызовите метод класса CreateX509() этого класса, как описано в предыдущих шагах.

Создайте экземпляр %XML.Security.X509Data следующим образом:

Где cred — это ранее созданный экземпляр %SYS.X509Credentials. Эти шаги создают элемент, который содержит элемент и элемент.

Добавьте элемент к элементу подписи следующим образом:

Где подпись — это экземпляр %XML.Security.Signature , а x509data — экземпляр %XML.Security.X509Data .

Создайте экземпляр %XML.Security.Reference следующим образом:

Продолжите предыдущие шаги с шага 6 (вызов AddReference() ).

Скопировать ссылку на этот раздел Проверка цифровой подписи

Для любого документа с цифровой подписью, который вы получаете, вы можете проверить подписи. Вам не обязательно иметь класс с поддержкой XML, соответствующий содержимому документа.

Скопировать ссылку на этот раздел Необходимые условия для проверки подписи

Чтобы проверить цифровую подпись, вы должны сначала предоставить InterSystems IRIS доверенный сертификат для подписавшего. InterSystems IRIS может проверить подпись, если она может проверить цепочку сертификатов подписывающей стороны от собственного сертификата подписывающей стороны до самозаверяющего сертификата от центра сертификации (ЦС), которому доверяет InterSystems IRIS, включая промежуточные сертификаты (если таковые имеются).

Скопировать ссылку на этот раздел Проверка подписи

Чтобы проверить подписи в XML-документе с цифровой подписью, выполните следующие действия:

Создайте экземпляр %XML.Reader и используйте его для открытия документа.

Получите свойство Document вашего средства чтения. Это экземпляр %XML.Document, который содержит XML-документ в виде DOM.

Используйте метод Correlate() средства чтения, чтобы сопоставить элемент или элементы с классом %XML.Security.Signature . Например:

Пройдитесь по документу, чтобы прочитать элемент или элементы. Для этого используется метод чтения Next(), который возвращает импортированный объект, если он есть, по ссылке. Например:

Импортированный объект является экземпляром %XML.Security.Signature .

Вызовите метод ValidateDocument() импортированной подписи. Аргументом этого метода должен быть экземпляр %XML.Document, который вы получили ранее.

Дополнительные параметры проверки см. в справочнике по классам для этого метода в %XML.Security.Signature .

Скопировать ссылку на этот раздел Вариант: цифровая подпись, ссылающаяся на идентификатор

В типичном случае элемент включает элемент, который указывает на уникальный идентификатор в другом месте документа. InterSystems IRIS также поддерживает вариант, в котором элемент указывает на атрибут с именем ID, а не на Id. В этом варианте требуется дополнительная работа для подписания документа и его проверки.

Чтобы подписать документ цифровой подписью, выполните действия, описанные в разделах “Создание XML-документа с цифровой подписью,” со следующими изменениями:

Для класса с поддержкой XML включите свойство, которое проецируется как атрибут ID, а не как атрибут Id.

При создании и добавлении подписи вызовите метод AddIDs() экземпляра %XML.Document. Сделайте это после получения сериализованного XML-документа и перед вызовом метода SignDocument() объекта подписи. Например:

При проверке документа включите следующие шаги непосредственно перед вызовом Correlate():

Читайте также: