При работе с внешними сервисами из 1С через объект WinHttp.WinHttpRequest программисты и системные администраторы часто сталкиваются с ошибкой «The connection with the server was terminated abnormally». Эта проблема особенно актуальна для систем, работающих на базе устаревших операционных систем, таких как Windows Server 2003 или Windows XP. В данной статье мы подробно разберем, почему возникает этот сбой, и какие шаги необходимо предпринять для его устранения.
Ошибка буквально означает, что соединение с сервером было прервано аномальным образом. Это происходит еще на этапе попытки установить защищенное соединение (Handshake), до того как данные будут переданы или получены. Проанализируем типичную ситуацию: на локальном компьютере с Windows 10 запрос из 1С проходит успешно, а на сервере Windows 2003 та же самая обработка выдает ошибку.
Для начала выполним простую проверку, чтобы исключить проблемы на стороне самого сервера 1С или сетевого экрана:
GET в браузере на сервере. Если сайт не открывается или выдает ошибку сертификата, проблема в инфраструктуре.Если браузер открывает страницу, но 1С продолжает выдавать ошибку, значит, корень проблемы кроется в глубоких настройках безопасности и протоколах шифрования библиотеки WinHttp.
Разберем техническую сторону вопроса. Современные веб-серверы (банки, государственные порталы, 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».
Выясним, что такое SNI. Это расширение протокола TLS, которое позволяет клиенту сообщить имя хоста, к которому он пытается подключиться, на этапе установки соединения. Это критически важно, если на одном IP-адресе хостится несколько сайтов с разными SSL-сертификатами. Старые версии библиотеки WinHttp в Windows 2003 не умеют передавать SNI, сервер не может понять, какой сертификат предъявить клиенту, и закрывает соединение.
Проанализируем ситуацию с сертификатами. Большинство современных сертификатов подписаны алгоритмом SHA-256. Windows 2003 «из коробки» не понимает такие подписи. Кроме того, современные серверы требуют специфические наборы шифров (Cipher Suites), таких как AES-GCM или ECDHE, которых просто нет в системной библиотеке Schannel старых ОС.
Если обновить операционную систему невозможно, наиболее эффективным способом будет отказ от использования системного 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.
Посмотрим на более элегантное решение для системных администраторов — установку stunnel. Это небольшая программа, которая создает локальный защищенный туннель.
Рассмотрим схему работы:
stunnel на сервере с 1С.http://localhost:8080.stunnel принимает обычный HTTP-запрос, упаковывает его в современный TLS 1.2 и отправляет целевому серверу.Это позволяет коду 1С работать по простому протоколу, делегируя все сложности шифрования специализированному софту.
Иногда ошибка возникает не из-за шифрования, а из-за того, что сервер долго отвечает, или проверка цепочки сертификатов на старом процессоре занимает слишком много времени. В таких случаях стоит попробовать принудительно увеличить время ожидания.
Проанализируем метод 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;
Исключение
Сообщить("Ошибка соединения: " + ОписаниеОшибки());
КонецПопытки;
Для 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% случаев является признаком технологического разрыва между устаревшей ОС и требованиями безопасности современного интернета.
Рассмотрим приоритетность действий:
cURL в коде 1С.stunnel или Nginx в качестве обратного прокси на более современной машине в локальной сети.Помните, что попытки «подкрутить» настройки Internet Explorer 6 на Windows 2003 для работы с современными API чаще всего не приносят результата, так как ограничения зашиты в ядро системы и библиотеки работы с защищенными сокетами.