Как реализовать обмен SOAP-сообщениями с цифровой подписью X.509 в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Интеграция с внешними сервисами, использующими протокол SOAP в сочетании с WS-Security, часто ставит перед разработчиком 1С вопросы о выборе правильного инструментария. В данной статье мы разберем, почему штатные веб-сервисы не всегда подходят для таких задач и как правильно организовать обработку подписанных сообщений.

Выбор архитектуры: Веб-сервис или HTTP-сервис?

Первый вопрос, который возникает при реализации обмена — какой объект платформы выбрать. Веб-сервисы в 1С, основанные на WSDL, прекрасно справляются со стандартными SOAP-запросами, однако их возможности сильно ограничены, когда дело доходит до специфических заголовков.

Если в вашем SOAP-конверте в блоке Header присутствуют узлы wsse:BinarySecurityToken, Signature или другие элементы спецификации WS-Security, стандартный механизм веб-сервисов может отбросить эти данные или не дать вам к ним доступа. В такой ситуации единственным верным решением будет использование HTTP-сервиса.

Почему HTTP-сервис предпочтительнее?

  1. Вы получаете полный доступ к «сырому» телу запроса через методы объекта Request.
  2. Вы можете самостоятельно парсить заголовки XML, не опасаясь, что платформа их проигнорирует.
  3. Вы полностью контролируете процесс формирования ответа, что критично для повторной подписи сообщения.

Как прочитать подписанное сообщение?

Многие разработчики ошибочно полагают, что для чтения подписанного сообщения требуется криптография. На самом деле, подписанный конверт — это обычный XML-файл. Сама подпись представлена в виде отдельных узлов внутри документа. Для того чтобы извлечь данные, вам не нужны сертификаты — достаточно стандартных инструментов 1С для работы с XML.

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

Пример получения тела запроса в HTTP-сервисе:


Функция Post(Запрос)
    ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();
    // Дальнейшая работа с XML через ЧтениеXML или ПостроительDOM
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(ТелоЗапроса);
    // ... логика парсинга
    Возврат Новый HTTPСервисОтвет(200);
КонецФункции

Проверка валидности электронной подписи

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

Если подпись выполнена по стандарту XMLDSIG, для ее проверки в современных типовых конфигурациях 1С (на базе БСП) предусмотрена встроенная функция:

ПроверитьПодпись(Данные, Сертификат)

Основные рекомендации по проверке:

  1. Целостность данных: Помните, что XMLDSIG крайне чувствителен к структуре. Любое лишнее изменение (например, добавление пробела или символа переноса строки при чтении) приведет к нарушению контрольной суммы, и подпись станет невалидной.
  2. Криптопровайдер: Убедитесь, что на сервере 1С установлен и правильно настроен криптопровайдер (например, CryptoPro CSP), соответствующий типу вашего сертификата.
  3. Извлечение данных: Если сертификат передается в BinarySecurityToken, вам необходимо сначала декодировать его (обычно это Base64), сохранить во временный файл или использовать как объект Сертификат, а затем передать в функцию проверки.

Советы по отладке

Работа с WS-Security — задача сложная. Если вы столкнулись с ошибкой валидации, проанализируйте следующие моменты:

Подводя итог: для работы с подписанными SOAP-сообщениями используйте HTTP-сервисы, работайте с XML как с DOM-структурой, а для проверки подписи задействуйте функции БСП или возможности криптопровайдера, установленного на вашем сервере.

← На главную