Как выполнить HTTPS-запрос в 1С 7.7 на Windows Server 2003 при отсутствии поддержки TLS 1.2?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Работа с современными веб-сервисами на устаревших операционных системах, таких как Windows Server 2003, представляет собой серьезную техническую проблему. Основная причина кроется в эволюции протоколов безопасности: большинство современных сайтов и государственных порталов перешли на использование протокола TLS 1.2 и выше, в то время как Windows Server 2003 нативно поддерживает только устаревшие протоколы SSL 3.0 и TLS 1.0. В этой статье мы детально проанализируем, почему стандартные методы 1С 7.7 перестают работать, и разберем наиболее эффективные способы решения задачи.

Почему возникают ошибки при HTTPS-запросах?

Рассмотрим ситуацию: при попытке выполнить запрос через стандартные COM-объекты Microsoft.XMLHTTP или WinHttp.WinHttpRequest.5.1, система выдает ошибку: "Системная ошибка: -2146697208" или "Не удается установить соединение с сервером". Проанализируем причину этого поведения.

Библиотеки msxml3.dll, msxml6.dll и winhttp.dll в составе Windows Server 2003 используют системный компонент Schannel (Secure Channel) для установления защищенного соединения. Поскольку в этой версии ОС компонент Schannel не умеет работать с TLS 1.2, "рукопожатие" (handshake) между сервером 1С и веб-сайтом обрывается на начальном этапе. Сайт требует безопасный шифр, который сервер предоставить не может.

Выясним, какие варианты решения существуют, и выберем наиболее стабильный из них.

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

Как показывает практика и обсуждение на форуме, это самый надежный и быстрый способ. Утилита curl не зависит от системных библиотек Windows для работы с SSL/TLS, так как несет в себе собственные библиотеки (обычно OpenSSL). Это позволяет ей успешно работать с TLS 1.2 даже на "древних" операционных системах.

Рассмотрим по шагам, как реализовать этот метод в 1С 7.7:

  1. Скачайте скомпилированную версию curl для Windows (архив с исполняемым файлом curl.exe).
  2. Разместите файл curl.exe в каталоге базы данных или в системной папке, доступной для запуска.
  3. Используйте объект WScript.Shell для вызова команды и получения результата.

Разберем пример кода для выполнения GET-запроса и сохранения ответа в файл:


// Определим пути и параметры
ПутьККурлу = "C:\Tools\curl.exe";
АдресЗапроса = "https://www.nbrb.by/Services/XmlExRates.aspx?ondate=12/07/2020";
ИмяФайлаОтвета = "C:\Temp\answer.xml";

// Сформируем команду
// Параметр -k (--insecure) позволяет игнорировать проверку сертификатов, 
// что полезно, если корневые сертификаты на сервере давно не обновлялись
Команда = ПутьККурлу + " -k """ + АдресЗапроса + """ -o """ + ИмяФайлаОтвета + """";

// Запустим выполнение через WScript.Shell
Попытка
    WshShell = СоздатьОбъект("WScript.Shell");
    // 0 - скрыть окно консоли, 1 - ждать завершения
    РезультатКода = WshShell.Run(Команда, 0, 1);
    
    Если РезультатКода = 0 Тогда
        Сообщить("Запрос выполнен успешно. Файл сохранен: " + ИмяФайлаОтвета);
    Иначе
        Сообщить("Ошибка при выполнении curl. Код возврата: " + РезультатКода);
    КонецЕсли;
Исключение
    Сообщить("Не удалось запустить WScript.Shell: " + ОписаниеОшибки());
КонецПопытки;

Проанализируем важные параметры команды. Флаг -k является критически важным для старых систем, так как он разрешает соединение даже при отсутствии актуальных цепочек доверия в хранилище сертификатов Windows. Флаг -o указывает путь к файлу, в который будет записан ответ сервера.

Решение 2: Обновление системы через POSReady 2009

Существует "хакерский", но эффективный метод добавления поддержки TLS 1.2 в Windows Server 2003. Данная ОС архитектурно близка к Windows Embedded POSReady 2009, для которой выпускались обновления гораздо дольше. Рассмотрим алгоритм действий:

  1. В реестре Windows в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WindowsEmbedded\PosReady создается параметр Installed (DWORD) со значением 1.
  2. После этого система начинает "видеть" обновления для POSReady 2009.
  3. Необходимо установить обновление KB4019276, которое добавляет поддержку TLS 1.2.
  4. После установки требуется включить протоколы в реестре в ветке SCHANNEL\Protocols\TLS 1.2\Client.

Внимание: этот метод потенциально опасен и может привести к нестабильной работе сервера. Мы рекомендуем использовать его только в крайнем случае, если использование внешних утилит типа curl невозможно.

Решение 3: Использование Stunnel как прокси-сервера

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

Рассмотрим схему взаимодействия:

  1. Устанавливаем Stunnel на Windows Server 2003.
  2. Настраиваем конфигурацию (stunnel.conf), чтобы он слушал, например, порт 8080 локально и перенаправлял запросы на nbrb.by:443.
  3. В коде 1С меняем адрес запроса на http://localhost:8080/Services/XmlExRates.aspx....

Этот способ позволяет избежать правок кода в части работы с COM-объектами, достаточно изменить только URL.

Решение 4: Переход на внешние компоненты (Chilkat)

Для тех, кто предпочитает объектный подход внутри 1С, существуют коммерческие библиотеки, такие как Chilkat ActiveX. Рассмотрим преимущества этого подхода. Компоненты Chilkat не используют системный Schannel Windows. У них свой собственный стек реализации SSL/TLS и свои алгоритмы шифрования. Это гарантирует, что HTTPS-запрос будет работать одинаково успешно как на Windows 10, так и на Windows Server 2003 без каких-либо обновлений ОС.

Пример работы с такой компонентой (условно):


Http = СоздатьОбъект("Chilkat.Http");
// Компонента сама выберет TLS 1.2, если сервер его требует
Ответ = Http.QuickGetStr("https://www.nbrb.by/...");
Если Http.LastMethodSuccess = 0 Тогда
    Сообщить(Http.LastErrorText);
КонецЕсли;

Сравнение методов и выводы

Проанализировав все доступные варианты, мы можем сделать следующие выводы:

Посмотрим на финальный совет: если ваша задача — просто скачивать курсы валют или обмениваться данными с одним-двумя сайтами, остановитесь на варианте с curl. Это решение проверено временем и сотнями администраторов, поддерживающих старые базы 1С 7.7.

← На главную