Как перевести запрос с WinHttp.WinHttpRequest.5.1 на встроенное ЗащищенноеСоединениеOpenSSL в 1С

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

В практике интеграции 1С с внешними веб-сервисами часто встречается использование COM-объекта WinHttp.WinHttpRequest.5.1. Это мощный инструмент, использующий системные библиотеки Windows, однако он имеет ряд недостатков: привязка к операционной системе, сложности с отладкой "System error" и необходимость использования MSScriptControl для установки некоторых параметров. В этой статье мы подробно разберем, как переписать такой код на нативный язык 1С, используя HTTPСоединение и ЗащищенноеСоединениеOpenSSL, а также выясним, почему возникают ошибки при проверке удаленного узла.

Анализируем исходный код WinHttp

Прежде чем приступать к "переводу", нам необходимо понять, какие именно настройки были заданы в исходном скрипте. Рассмотрим ключевые строки, которые автор устанавливал через MSScriptControl:

Проанализировав эти параметры, мы понимаем, что исходный код работает в режиме "максимального доверия" ко всем сертификатам, что не всегда безопасно, но иногда необходимо для работы с самоподписанными сертификатами или специфическими государственными узлами.

Шаг 1. Подготовка сертификатов для 1С

Объект ЗащищенноеСоединениеOpenSSL в 1С требует сертификаты в определенных форматах, отличных от системного хранилища Windows. Если в WinHttp вы обращались к сертификату по пути CURRENT_USER\MY\cert.pki, то для 1С вам понадобится подготовить файлы:

  1. Клиентский сертификат (PFX): Это файл, содержащий ваш личный сертификат и закрытый ключ. Он должен иметь расширение .pfx или .p12. Если у вас есть только доступ к контейнеру в Windows, его нужно экспортировать вместе с закрытым ключом и установить пароль на этот файл.
  2. Сертификаты Удостоверяющих Центров (PEM): Это текстовый файл с расширением .pem, содержащий цепочку доверенных корневых сертификатов. В него должны быть включены сертификаты тех центров, которые выдали сертификат серверу, к которому вы подключаетесь.

Шаг 2. Реализация нативного кода 1С

Рассмотрим структуру кода, которая заменяет 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 с флагами игнорирования ошибок.

Возможные причины:

Как обойти проверку (в целях отладки)

Если вам необходимо добиться работы кода любой ценой (аналог флага 13056 в WinHttp), в современных версиях платформы 1С при создании объекта ЗащищенноеСоединениеOpenSSL можно управлять проверкой подлинности. Рассмотрим, как это сделать:


// В конструкторе можно указать параметры проверки. 
// Однако помните, что полное отключение проверки делает соединение уязвимым.
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
    СертификатКлиента, 
    СертификатыУЦ, 
    Ложь // Этот параметр (ПроверятьПодлинностьСервера) отключает проверку сертификата сервера
);

Важный нюанс: Параметр отключения проверки подлинности появился не во всех версиях платформы и может работать по-разному в зависимости от операционной системы (Windows/Linux).

Рекомендации по отладке

Если вы столкнулись с трудностями, проанализируем ситуацию по следующим пунктам:

Таким образом, мы выяснили, что прямой перевод с WinHttp на ЗащищенноеСоединениеOpenSSL требует не только смены синтаксиса, но и тщательной подготовки криптографического окружения. Использование нативных средств 1С сделает ваше решение более кроссплатформенным и избавит от зависимости от COM-технологий.

← На главную