Работа с современными веб-сервисами на устаревших операционных системах, таких как Windows Server 2003, представляет собой серьезную техническую проблему. Основная причина кроется в эволюции протоколов безопасности: большинство современных сайтов и государственных порталов перешли на использование протокола TLS 1.2 и выше, в то время как Windows Server 2003 нативно поддерживает только устаревшие протоколы SSL 3.0 и TLS 1.0. В этой статье мы детально проанализируем, почему стандартные методы 1С 7.7 перестают работать, и разберем наиболее эффективные способы решения задачи.
Рассмотрим ситуацию: при попытке выполнить запрос через стандартные 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С и веб-сайтом обрывается на начальном этапе. Сайт требует безопасный шифр, который сервер предоставить не может.
Выясним, какие варианты решения существуют, и выберем наиболее стабильный из них.
Как показывает практика и обсуждение на форуме, это самый надежный и быстрый способ. Утилита curl не зависит от системных библиотек Windows для работы с SSL/TLS, так как несет в себе собственные библиотеки (обычно OpenSSL). Это позволяет ей успешно работать с TLS 1.2 даже на "древних" операционных системах.
Рассмотрим по шагам, как реализовать этот метод в 1С 7.7:
curl.exe).curl.exe в каталоге базы данных или в системной папке, доступной для запуска.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 указывает путь к файлу, в который будет записан ответ сервера.
Существует "хакерский", но эффективный метод добавления поддержки TLS 1.2 в Windows Server 2003. Данная ОС архитектурно близка к Windows Embedded POSReady 2009, для которой выпускались обновления гораздо дольше. Рассмотрим алгоритм действий:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WindowsEmbedded\PosReady создается параметр Installed (DWORD) со значением 1.SCHANNEL\Protocols\TLS 1.2\Client.Внимание: этот метод потенциально опасен и может привести к нестабильной работе сервера. Мы рекомендуем использовать его только в крайнем случае, если использование внешних утилит типа curl невозможно.
Если нам нужно, чтобы 1С 7.7 продолжала "думать", что она работает по обычному протоколу HTTP, а шифрование происходило "на лету", мы можем использовать Stunnel. Это локальный прокси-сервер, который принимает незашифрованный трафик и перенаправляет его по зашифрованному каналу.
Рассмотрим схему взаимодействия:
nbrb.by:443.http://localhost:8080/Services/XmlExRates.aspx....Этот способ позволяет избежать правок кода в части работы с COM-объектами, достаточно изменить только URL.
Для тех, кто предпочитает объектный подход внутри 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.