Как настроить работу WinHttp по протоколу TLS 1.2 в 1С?

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

При интеграции 1С с внешними веб-сервисами (SMS-шлюзы, банки, государственные порталы) разработчики часто сталкиваются с ситуацией, когда старый и проверенный код перестает работать. Причина кроется в отказе современных сервисов от устаревших протоколов шифрования TLS 1.0 и TLS 1.1 в пользу более защищенного TLS 1.2. Если ваша конфигурация использует WinHttp.WinHttpRequest.5.1, вы можете столкнуться с ошибками при вызове метода Send(). В этой статье мы подробно разберем, как адаптировать код и настройки системы для поддержки TLS 1.2.

Причина возникновения проблемы

Объект WinHttp.WinHttpRequest.5.1 является COM-объектом операционной системы Windows. Его поведение и поддержка протоколов напрямую зависят от версии ОС и установленных в ней обновлений. По умолчанию старые версии Windows (Windows 7, Server 2008 R2) не используют TLS 1.2 для WinHTTP, даже если сам протокол поддерживается системой. Разберем три основных способа решения этой задачи: настройка опций самого объекта, правка системного реестра и переход на встроенные средства платформы 1С.

Способ 1. Программная установка параметров WinHttp

Для того чтобы заставить объект WinHttpRequest использовать современные протоколы, необходимо установить специальную опцию SecureProtocols (которая имеет индекс 9). Рассмотрим, как это сделать правильно. Многие ошибочно пытаются использовать Option(4), но эта опция отвечает за игнорирование ошибок сертификатов, а не за выбор протокола.

Проанализируем пример кода, который принудительно включает TLS 1.1 и TLS 1.2:


WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Значение 2048 соответствует TLS 1.2
// Значение 512 соответствует TLS 1.1
// Сумма 2560 включает оба протокола
WinHttp.Option(9, 2560); 

WinHttp.Open("GET", "https://tls12.example.com/api/data", Ложь);
WinHttp.Send();
ТекстОтвета = WinHttp.ResponseText();

В некоторых случаях, если вы используете устаревшие компоненты типа MSScriptControl, код может выглядеть сложнее, как упоминалось в обсуждении. Однако прямой вызов через Option(9) является наиболее чистым и понятным методом для 1С.

Способ 2. Игнорирование ошибок безопасности (Option 4)

Иногда соединение обрывается не из-за отсутствия протокола, а из-за проблем с проверкой сертификата (например, если на сервере установлен самоподписанный сертификат или цепочка доверия неполная). Для отладки или работы в закрытых сетях можно использовать Option(4).

Разберем значение магического числа 13056, которое часто встречается на форумах:

  1. Оно является суммой флагов, которые приказывают WinHttp игнорировать неизвестные центры сертификации, несовпадение имен в сертификате и истекшие даты.
  2. Использование этого параметра снижает безопасность соединения, поэтому применяйте его с осторожностью.

// Игнорировать все ошибки SSL
WinHttp.Option(4, 13056);

Способ 3. Настройка операционной системы и реестра

Если программная установка опций не помогает, выясним причину в настройках Windows. WinHTTP может быть ограничен системными политиками. Для активации TLS 1.2 выполним следующие шаги в реестре:

Перейдем в ветку: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp

Создадим параметр типа DWORD с именем DefaultSecureProtocols. Значения могут быть следующими:

Важно: Для 64-битных систем эти же действия необходимо повторить в ветке Wow6432Node: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp.

Также убедимся, что для старых ОС (Windows 7/Server 2008 R2) установлено обновление KB3140245, без которого поддержка этих ключей реестра просто не активируется.

Способ 4. Переход на нативные средства 1С (HTTPСоединение)

Посмотрим на ситуацию шире. Автор вопроса указал версию платформы 8.3.9. Начиная с версии 8.3.6, платформа 1С умеет работать с защищенными соединениями самостоятельно, используя встроенную библиотеку OpenSSL. Это гораздо надежнее, так как ваш код перестает зависеть от обновлений и настроек конкретной Windows-машины.

Разберем, как переписать исходный код на использование HTTPСоединение:


// Настраиваем защищенное соединение
// Платформа сама выберет максимально доступный протокол (включая TLS 1.2)
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// Разделяем URL на сервер и ресурс
Сервер = "tls11.esputnik.com";
Ресурс = "api/v1/balance";

// Создаем соединение
HTTPСоединение = Новый HTTPСоединение(Сервер, , ЛогинЕСпутник, ПарольЕСпутник, , , Защита);

// Формируем запрос
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");

// Отправляем и получаем результат
Ответ = HTTPСоединение.Получить(Запрос);

ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
Если Ответ.КодСостояния = 200 Тогда
    УспешнаяОтправка = Истина;
Иначе
    УспешнаяОтправка = Ложь;
КонецЕсли;

Почему HTTPСоединение лучше?

Проанализируем преимущества нативного подхода:

  1. Кроссплатформенность: Этот код будет работать как на Windows, так и на Linux-серверах 1С.
  2. Независимость от разрядности: Вам не нужно переживать о том, зарегистрирован ли 32-битный COM-объект в 64-битной системе.
  3. Стабильность: Использование встроенных механизмов платформы уменьшает количество "прослоек" и потенциальных точек отказа.
  4. Удобство отладки: Ошибки HTTPСоединения более информативны и легче перехватываются встроенными средствами 1С.

Таким образом, если ваша версия платформы позволяет (а 8.3.9 это позволяет), мы рекомендуем отказаться от WinHttp.WinHttpRequest в пользу HTTPСоединение с использованием объекта ЗащищенноеСоединениеOpenSSL. Это решит проблему с протоколами TLS раз и навсегда.

← На главную