В практике интеграции 1С с внешними веб-сервисами часто встречается использование COM-объекта WinHttp.WinHttpRequest.5.1. Это мощный инструмент, использующий системные библиотеки Windows, однако он имеет ряд недостатков: привязка к операционной системе, сложности с отладкой "System error" и необходимость использования MSScriptControl для установки некоторых параметров. В этой статье мы подробно разберем, как переписать такой код на нативный язык 1С, используя HTTPСоединение и ЗащищенноеСоединениеOpenSSL, а также выясним, почему возникают ошибки при проверке удаленного узла.
Прежде чем приступать к "переводу", нам необходимо понять, какие именно настройки были заданы в исходном скрипте. Рассмотрим ключевые строки, которые автор устанавливал через MSScriptControl:
SslErrorIgnoreFlags. Значение 13056 (0x3300 в шестнадцатеричной системе) означает игнорирование практически всех ошибок сертификатов: неизвестный центр сертификации, несовпадение имени узла и просроченный сертификат. Именно благодаря этому флагу WinHttp часто работает там, где "пасует" 1С.Проанализировав эти параметры, мы понимаем, что исходный код работает в режиме "максимального доверия" ко всем сертификатам, что не всегда безопасно, но иногда необходимо для работы с самоподписанными сертификатами или специфическими государственными узлами.
Объект ЗащищенноеСоединениеOpenSSL в 1С требует сертификаты в определенных форматах, отличных от системного хранилища Windows. Если в WinHttp вы обращались к сертификату по пути CURRENT_USER\MY\cert.pki, то для 1С вам понадобится подготовить файлы:
.pfx или .p12. Если у вас есть только доступ к контейнеру в Windows, его нужно экспортировать вместе с закрытым ключом и установить пароль на этот файл..pem, содержащий цепочку доверенных корневых сертификатов. В него должны быть включены сертификаты тех центров, которые выдали сертификат серверу, к которому вы подключаетесь.Рассмотрим структуру кода, которая заменяет COM-объект. Разберем по шагам создание защищенного соединения и отправку POST-запроса.
// 1. Инициализируем защищенное соединение
// Указываем путь к клиентскому сертификату и пароль к нему
СертификатКлиента = Новый СертификатКлиентаФайл("C:\Certs\client.pfx", "ВашПароль");
// Если нужно проверять подлинность сервера, указываем файл с корневыми сертификатами
// Если файл не указать, 1С будет использовать встроенные сертификаты ОС
СертификатыУЦ = Новый СертификатыУдостоверяющихЦентровФайл("C:\Certs\ca.pem");
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, СертификатыУЦ);
// 2. Настраиваем параметры HTTP-соединения
// Обратите внимание: имя сервера указывается без "https://"
ИмяСервера = "example.com";
Порт = 443;
Попытка
HTTPСоединение = Новый HTTPСоединение(ИмяСервера, Порт, , , , 60, ЗащищенноеСоединение);
// 3. Формируем запрос
ПутьКРесурсу = "/api/v1/send_data";
HTTPЗапрос = Новый HTTPЗапрос(ПутьКРесурсу);
// Устанавливаем заголовки (аналог SetRequestHeader в WinHttp)
HTTPЗапрос.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
// Устанавливаем тело запроса (аналог Send(СтрокаXML))
СтрокаXML = "ваш текст xml";
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаXML, КодировкаТекста.UTF8);
// 4. Отправляем запрос
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
// 5. Обрабатываем результат
Если HTTPОтвет.КодСостояния = 200 Тогда
ОтветСтр = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Сообщить("Запрос успешно выполнен!");
Иначе
Сообщить("Ошибка! Код состояния: " + HTTPОтвет.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Произошла ошибка при работе с HTTP: " + ИнформацияОбОшибке().Описание);
КонецПопытки;
Проанализируем ситуацию, когда код написан верно, файлы сертификатов подключены, но 1С выдает ошибку проверки. Основная причина заключается в том, что ЗащищенноеСоединениеOpenSSL работает гораздо строже, чем WinHttp с флагами игнорирования ошибок.
Возможные причины:
.pem должен находиться не один сертификат, а вся иерархия (Корневой -> Промежуточный -> Серверный). Выясним причину, изучив сертификат сайта в браузере.server.local), 1С прервет соединение.ЗащищенноеСоединениеOpenSSL от 1С не сможет с ним работать "из коробки", так как библиотека OpenSSL в 1С обычно собрана без поддержки ГОСТ-алгоритмов. В этом случае WinHttp через системный криптопровайдер работает, а 1С — нет.Если вам необходимо добиться работы кода любой ценой (аналог флага 13056 в WinHttp), в современных версиях платформы 1С при создании объекта ЗащищенноеСоединениеOpenSSL можно управлять проверкой подлинности. Рассмотрим, как это сделать:
// В конструкторе можно указать параметры проверки.
// Однако помните, что полное отключение проверки делает соединение уязвимым.
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
СертификатКлиента,
СертификатыУЦ,
Ложь // Этот параметр (ПроверятьПодлинностьСервера) отключает проверку сертификата сервера
);
Важный нюанс: Параметр отключения проверки подлинности появился не во всех версиях платформы и может работать по-разному в зависимости от операционной системы (Windows/Linux).
Если вы столкнулись с трудностями, проанализируем ситуацию по следующим пунктам:
.pem блокнотом. Он должен начинаться с -----BEGIN CERTIFICATE-----. Если там "кракозябры", значит файл в формате DER, и его нужно конвертировать.Таким образом, мы выяснили, что прямой перевод с WinHttp на ЗащищенноеСоединениеOpenSSL требует не только смены синтаксиса, но и тщательной подготовки криптографического окружения. Использование нативных средств 1С сделает ваше решение более кроссплатформенным и избавит от зависимости от COM-технологий.