Как исправить ошибку WinHttp.WinHttpRequest: The connection with the server was terminated abnormally в 1С

Системный администратор IT и автоматизация бизнеса
← На главную

При работе с внешними сервисами из 1С через объект WinHttp.WinHttpRequest программисты и системные администраторы часто сталкиваются с ошибкой «The connection with the server was terminated abnormally». Эта проблема особенно актуальна для систем, работающих на базе устаревших операционных систем, таких как Windows Server 2003 или Windows XP. В данной статье мы подробно разберем, почему возникает этот сбой, и какие шаги необходимо предпринять для его устранения.

Суть проблемы и первичная диагностика

Ошибка буквально означает, что соединение с сервером было прервано аномальным образом. Это происходит еще на этапе попытки установить защищенное соединение (Handshake), до того как данные будут переданы или получены. Проанализируем типичную ситуацию: на локальном компьютере с Windows 10 запрос из 1С проходит успешно, а на сервере Windows 2003 та же самая обработка выдает ошибку.

Для начала выполним простую проверку, чтобы исключить проблемы на стороне самого сервера 1С или сетевого экрана:

  1. Попробуем выполнить запрос через обычный GET в браузере на сервере. Если сайт не открывается или выдает ошибку сертификата, проблема в инфраструктуре.
  2. Проверим, добавлен ли адрес в список доверенных узлов в настройках Internet Explorer.
  3. Убедимся, что на сервере есть доступ в интернет и запросы не блокируются прокси-сервером или брандмауэром.

Если браузер открывает страницу, но 1С продолжает выдавать ошибку, значит, корень проблемы кроется в глубоких настройках безопасности и протоколах шифрования библиотеки WinHttp.

Причина №1: Устаревшие протоколы TLS (1.2 и 1.3)

Разберем техническую сторону вопроса. Современные веб-серверы (банки, государственные порталы, API крупных сервисов) в целях безопасности отказываются от поддержки протоколов SSL 3.0 и TLS 1.0. Сегодня стандартом является TLS 1.2, а все чаще — TLS 1.3.

Windows Server 2003 нативно поддерживает только протоколы до TLS 1.0 включительно. Когда объект WinHttp.WinHttpRequest.5.1 пытается инициировать соединение, он предлагает серверу использовать устаревший протокол. Современный сервер, видя небезопасный запрос, мгновенно обрывает сессию. Именно это обрыв и трактуется системой как «terminated abnormally».

Причина №2: Отсутствие поддержки SNI (Server Name Indication)

Выясним, что такое SNI. Это расширение протокола TLS, которое позволяет клиенту сообщить имя хоста, к которому он пытается подключиться, на этапе установки соединения. Это критически важно, если на одном IP-адресе хостится несколько сайтов с разными SSL-сертификатами. Старые версии библиотеки WinHttp в Windows 2003 не умеют передавать SNI, сервер не может понять, какой сертификат предъявить клиенту, и закрывает соединение.

Причина №3: Поддержка алгоритмов SHA-256 и Cipher Suites

Проанализируем ситуацию с сертификатами. Большинство современных сертификатов подписаны алгоритмом SHA-256. Windows 2003 «из коробки» не понимает такие подписи. Кроме того, современные серверы требуют специфические наборы шифров (Cipher Suites), таких как AES-GCM или ECDHE, которых просто нет в системной библиотеке Schannel старых ОС.

Решение 1: Использование утилиты cURL как альтернативы WinHTTP

Если обновить операционную систему невозможно, наиболее эффективным способом будет отказ от использования системного COM-объекта в пользу внешней консольной утилиты cURL. Рассмотрим, как это реализовать в коде 1С. cURL использует собственные библиотеки (OpenSSL) и не зависит от настроек безопасности Windows.

Разберем пример кода для выполнения запроса через cURL:


// Путь к исполняемому файлу curl.exe
ПутьКCurl = "C:\Tools\curl.exe";
// Формируем параметры запроса
УРЛ = "https://api.service.com/data";
ФайлРезультата = "C:\Temp\answer.json";

// Команда запуска с параметрами (игнорируем проверку сертификата -k если нужно)
Команда = ПутьКCurl + " -X POST " + УРЛ + " -d ""param=value"" -o " + ФайлРезультата + " -k";

// Запускаем приложение и ждем завершения
ЗапуститьПриложение(Команда, , Истина);

// Читаем результат из файла
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ФайлРезультата);
Результат = Текст.ПолучитьТекст();

Использование cURL позволяет полностью обойти ограничения Windows Server 2003 по протоколам TLS 1.2.

Решение 2: Настройка проксирующего туннеля (stunnel)

Посмотрим на более элегантное решение для системных администраторов — установку stunnel. Это небольшая программа, которая создает локальный защищенный туннель.

Рассмотрим схему работы:

  1. Вы устанавливаете stunnel на сервере с 1С.
  2. Настраиваете его так, чтобы он слушал локальный порт (например, 8080) и перенаправлял трафик на внешний HTTPS-сервер.
  3. В 1С вы обращаетесь к http://localhost:8080.
  4. stunnel принимает обычный HTTP-запрос, упаковывает его в современный TLS 1.2 и отправляет целевому серверу.

Это позволяет коду 1С работать по простому протоколу, делегируя все сложности шифрования специализированному софту.

Решение 3: Увеличение таймаутов в WinHTTP

Иногда ошибка возникает не из-за шифрования, а из-за того, что сервер долго отвечает, или проверка цепочки сертификатов на старом процессоре занимает слишком много времени. В таких случаях стоит попробовать принудительно увеличить время ожидания.

Проанализируем метод SetTimeouts объекта WinHttpRequest:


HTTPЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Параметры: ResolveTimeout, ConnectTimeout, SendTimeout, ReceiveTimeout (в миллисекундах)
HTTPЗапрос.SetTimeouts(60000, 60000, 60000, 60000); 

HTTPЗапрос.Open("POST", "https://myserver.ru/api", Ложь);
Попытка
    HTTPЗапрос.Send(ДанныеЗапроса);
    Ответ = HTTPЗапрос.ResponseText;
Исключение
    Сообщить("Ошибка соединения: " + ОписаниеОшибки());
КонецПопытки;

Решение 4: Обновление компонентов Windows (KB938397)

Для Windows Server 2003 существует официальное обновление KB938397, которое добавляет поддержку алгоритмов SHA-2 (SHA-256). Это не решит проблему с TLS 1.2, но поможет, если сервер работает на TLS 1.0, но использует современные сертификаты подписи. Убедитесь, что это обновление установлено, а также обновлены корневые сертификаты (пакет rootsupd.exe).

Заключение и рекомендации

Подводя итог, можно сказать, что ошибка «The connection with the server was terminated abnormally» на старых системах в 90% случаев является признаком технологического разрыва между устаревшей ОС и требованиями безопасности современного интернета.

Рассмотрим приоритетность действий:

Помните, что попытки «подкрутить» настройки Internet Explorer 6 на Windows 2003 для работы с современными API чаще всего не приносят результата, так как ограничения зашиты в ядро системы и библиотеки работы с защищенными сокетами.

← На главную