Интеграция с внешними сервисами, использующими протокол SOAP в сочетании с WS-Security, часто ставит перед разработчиком 1С вопросы о выборе правильного инструментария. В данной статье мы разберем, почему штатные веб-сервисы не всегда подходят для таких задач и как правильно организовать обработку подписанных сообщений.
Первый вопрос, который возникает при реализации обмена — какой объект платформы выбрать. Веб-сервисы в 1С, основанные на WSDL, прекрасно справляются со стандартными SOAP-запросами, однако их возможности сильно ограничены, когда дело доходит до специфических заголовков.
Если в вашем SOAP-конверте в блоке Header присутствуют узлы wsse:BinarySecurityToken, Signature или другие элементы спецификации WS-Security, стандартный механизм веб-сервисов может отбросить эти данные или не дать вам к ним доступа. В такой ситуации единственным верным решением будет использование HTTP-сервиса.
Почему HTTP-сервис предпочтительнее?
Request.XML, не опасаясь, что платформа их проигнорирует.Многие разработчики ошибочно полагают, что для чтения подписанного сообщения требуется криптография. На самом деле, подписанный конверт — это обычный XML-файл. Сама подпись представлена в виде отдельных узлов внутри документа. Для того чтобы извлечь данные, вам не нужны сертификаты — достаточно стандартных инструментов 1С для работы с XML.
Для чтения структуры сообщения мы рекомендуем использовать следующие объекты:
ЧтениеXML — для потокового чтения, если сообщение очень большое.ДокументDOM — для навигации по узлам, если вам нужно найти конкретный блок подписи или данные пользователя.Пример получения тела запроса в HTTP-сервисе:
Функция Post(Запрос)
ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();
// Дальнейшая работа с XML через ЧтениеXML или ПостроительDOM
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТелоЗапроса);
// ... логика парсинга
Возврат Новый HTTPСервисОтвет(200);
КонецФункции
Вопрос проверки подписи — это второй этап после успешного получения сообщения. Как мы уже выяснили, сертификат нужен только для проверки того, что подпись не была скомпрометирована и принадлежит нужному отправителю.
Если подпись выполнена по стандарту XMLDSIG, для ее проверки в современных типовых конфигурациях 1С (на базе БСП) предусмотрена встроенная функция:
ПроверитьПодпись(Данные, Сертификат)
Основные рекомендации по проверке:
XMLDSIG крайне чувствителен к структуре. Любое лишнее изменение (например, добавление пробела или символа переноса строки при чтении) приведет к нарушению контрольной суммы, и подпись станет невалидной.BinarySecurityToken, вам необходимо сначала декодировать его (обычно это Base64), сохранить во временный файл или использовать как объект Сертификат, а затем передать в функцию проверки.Работа с WS-Security — задача сложная. Если вы столкнулись с ошибкой валидации, проанализируйте следующие моменты:
Exclusive C14N). Любое расхождение в настройках канонизации приведет к провалу проверки.SOAP (например, SoapUI), чтобы увидеть, как выглядит «идеальное» сообщение. Это поможет понять, на каком этапе ваш парсер теряет данные или искажает структуру XML.Подводя итог: для работы с подписанными SOAP-сообщениями используйте HTTP-сервисы, работайте с XML как с DOM-структурой, а для проверки подписи задействуйте функции БСП или возможности криптопровайдера, установленного на вашем сервере.