Проверка подписи XMLDSIG (WS-Security) с помощью сервиса СПЭП СМЭВ

Подготовка SOAP-сообщения перед созданием подписи XMLDSIG на примере СМЭВ
Проверка подписи XMLDSIG на примере СМЭВ
Проверка подписи органа власти с помощью сервиса СМЭВ

В методических рекомендациях по работе с единой системой межведомственного электронного взаимодействия для проверки электронной подписи информационных систем (ЭП-СМЭВ, ЭП-ОВ, ЭП-ПГУ)* и электронной подписи физических лиц (ЭП-П, ЭП-СП)* указывает специализированный сервис проверки - СПЭП (сервис проверки электронной подписи). Данный сервис обеспечивает проверку электронных подписей и сертификатов и включает методы, обеспечивающие:
  • проверку электронной подписи в формате XML digital signature;
  • проверку электронной подписи в формате WS-Security;
  • проверку электронной подписи в формате PKCS#7;
  • проверку статуса сертификата ключа подписи.
  • проверку электронной подписи в формате CAdES
  • проверку электронной подписи в формате XAdES
  • проверку электронной подписи в формате PAdES
  • проверку штампов времени
  • проверку электронной подписи, формируемой от лица пользователя ЕПГУ
Более подробное описание сервиса смотрите на технологическом портале СМЭВ. Рассмотрим пример использования сервиса для проверки электронной подписи в формате WS-Security.

Для выполнения проверки ЭП в формате WS-Security у веб-сервис определена операция VerifyWSSSignature. Операция имеет два входных параметра:
  1. message - Обязателен к заполнению. В параметр передается подписанное XML-сообщение в формате WS-Security, закодированное в формате base64.
  2. verifySignatureOnly - Обязателен к заполнению. Флаг, означающий требуется ли проверять только подпись или еще и статус сертификата подписи.
Результатом вызова операции VerifyWSSSignature является структура, содержащая два элемента:
  1. Code - содержит код проверки.
  2. Description - содержит текстовое описание ошибки или причины неудачной проверки (если есть).

Алгоритм вызова операции VerifyWSSSignature на платформе 1С


1. Записываем XML-сообщение в текстовый файл в кодировке CESU-8, это кодировка UTF-8 без BOM.

ТекстовыйФайл = Новый ЗаписьТекста(ИмяФайла, "CESU-8");
ТекстовыйФайл.Записать(ДокументXML);
ТекстовыйФайл.Закрыть();


2. Читаем текстовый файл как двоичные данные. Полученное XML-сообщение в виде двоичных данных будут передаваться в параметр message, который имеет тип base64binary. При передаче двоичных данных в параметр такого типа, двоичные данные автоматически конвертируются в формат base64, поэтому явного этого делать не нужно.

ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);

Способы конвертации строки в base64:
Конвертация строковых данных в строку формата base64
Конвертация строковых данных в строку формата base64. Способ N2.

3. Определяем веб-сервис с помощью объекта WSОпределения на основании WSDL-файла (WSDL-ссылка указанная в документации сервиса). После определения веб-сервиса создаем клиентский прокси с помощью объекта WSПрокси для вызова операций веб-сервиса. Для создания объекта WSПрокси в конструктор передаются значения параметров, которые берутся из WSDL-файла.

ПространствоИмен = "http://esv.server.rt.ru";
WSОпределение = Новый WSОпределения("http://195.245.214.33:7777/esv/?wsdl");
СПЭП = Новый WSПрокси(WSОпределение, ПространствоИмен, "SignatureTool", "SignatureToolSoap");


Подробная информация по инициализации объектов WSОпределения и WSПрокси по WSDL-файлу описана в статье Вызов Web-сервиса с помощью динамической ссылки.

4. Вызываем операцию веб-сервиса как обычную функцию с передачей параметров и анализируем результат.

Response = СПЭП.VerifyWSSSignature(ДвоичныеДанныеФайла, ВалидацияСертификата);
ПодписьВерна = ?(Response.Code = 0, Истина, Ложь);


Полный текст функции вызова сервиса СПЭП:

Функция ПроверитьНаСервере(ДокументXML, ВалидацияСертификата)
// Получаем имя временного файла с расширением xml.
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
// Записываем XML в текстовый файл в кодировке UTF-8 без BOM.
ТекстовыйФайл = Новый ЗаписьТекста(ИмяФайла, "CESU-8");
ТекстовыйФайл.Записать(ДокументXML);
ТекстовыйФайл.Закрыть();
// Считываем файл как двоичные данные.
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
УдалитьФайлы(ИмяФайла);
// Определеяем веб-сервис для вызова его операций.
ПространствоИмен = "http://esv.server.rt.ru";
WSОпределение = Новый WSОпределения("http://195.245.214.33:7777/esv/?wsdl");
СПЭП = Новый WSПрокси(WSОпределение, ПространствоИмен, "SignatureTool", "SignatureToolSoap");
// Вызываем операцию.
Response = СПЭП.VerifyWSSSignature(ДвоичныеДанныеФайла, ВалидацияСертификата);
// Анализируем ответ по коду. Если 0 - то все хорошо.
ПодписьВерна = ?(Response.Code = 0, Истина, Ложь);
// Возвращаем проанализированный ответ.
Возврат Response.Description;
КонецФункции // ПроверитьНаСервере()


Пример обработки можно скачать здесь (см. рисунок 1).
Рисунок 1. Пример работы обработки проверки ЭП
--------------------------------------------------------------------------------------------------------------------------
ЭП-СМЭВ - электронная подпись системы межведомственного электронного взаимодействия
ЭП-ОВ - электронная подпись органа власти
ЭП-ПГУ - электронная подпись портала государственных услуг
ЭП-П - электронная подпись пользователя ЕПГУ
ЭП-СП - электронная подпись служебного пользователя

Комментарии