Валидация сертификата при проверке подписи XMLDSIG

В статье Проверка подписи XMLDSIG на примере СМЭВ рассказывается про проверку электронной подписи (ЭП) формата XMLDSIG. Как показала практика, метод Verify() объекта SignedXML не выполняет валидацию (действительность) сертификата ЭП.

Проверить действительность сертификата каждой электронной подписи, которой подписан XML документ, можно с помощью свойства Signers того же объекта SignedXML. Коллекция Signers заполняется в порядке следования элементов, найденных XPath-запросом. По умолчанию используется следующий запрос:
"//*[local-name()='Signature' and namespace-uri()='http://www.w3.org/2000/09/xmldsig\#']".

Важно, свойство Signers доступно только после проверки подписи. Данное свойство содержит коллекцию подписей, для которых доступен ограниченный набор свойств:
  • можно узнать статус подписи при помощи свойства Signer.SignatureStatus;
  • получить информацию о сертификате ключа подписи при помощи свойства Signer.Certificate.
Свойство Signer.Certificate содержит объект Certificate. У данного объекта есть метод IsValid(), который выполняет проверку действительности сертификата и возвращает объект CertificateStatus, содержащий результат проверки.

Программный код проверки валидности сертификата электронных подписей:

Попытка
// Информацию о действительности каждой найденной подписи в документе можно получить при помощи свойства Signers.
// Например, можно получить сертификат и воспользоваться свойством Certificate.IsValid().Result.
// При этом будет построена цепочка до доверенного корневого УЦ и эта цепочка будет проверена на отзыв.
SignedXML.Verify(СтрокаXML);
Для Каждого Подпись Из SignedXML.Signers Цикл
Действительная = Подпись.Certificate.IsValid().Result;
Если Не Действительная Тогда
ВызватьИсключение "Подпись не действительная";
КонецЕсли;
КонецЦикла;
Корректная = Истина;
УровеньЖурнала = УровеньЖурналаРегистрации.Информация;
Комментарий = "Верная ЭП сообщения";
Исключение
УровеньЖурнала = УровеньЖурналаРегистрации.Предупреждение;
Комментарий = "Неверная ЭП сообщения: " + ОписаниеОшибки();
КонецПопытки;


В данном примере выполняется валидация сертификация по флагу CAPICOM_CHECK_ONLINE_ALL, который установлен по умолчанию. Более подробную информацию о свойствах и методах объекта Certificate, а так же по работе с этим объектом смотрите на сайте MSDN.

Приведенный алгоритм проверки применим не только к конкретному примеру. Его так же можно использовать и для проверки валидности сертификатов, установленных в хранилище сертификатов. Короче говоря, его можно применять там, где средствами 1С возможно через COM-объекты получить объект Certificate.

Комментарии