Разработчики, работающие на платформе 1С:Предприятие 8.2, часто сталкиваются с критической проблемой при попытке обмена данными с современными веб-сервисами. При использовании стандартного объекта HTTPСоединение возникает системная ошибка: "Ошибка работы с Интернет: SSL connect error". Причина этой ситуации кроется в том, что платформа 8.2 была выпущена в то время, когда стандарты шифрования были значительно слабее. Современные сайты и государственные порталы давно перешли на протоколы TLS 1.2 и TLS 1.3, которые встроенные механизмы 8.2 просто «не понимают» на программном уровне.
В этой статье мы подробно разберем, как обойти это ограничение, не прибегая к экстренному обновлению всей информационной базы на платформу 8.3. Мы проанализируем использование системных COM-объектов, внешних утилит и специализированных прокси-серверов.
Прежде чем перейти к решениям, выясним причину проблемы. Объект HTTPСоединение в версии 8.2 использует старые библиотеки OpenSSL, которые поддерживают максимум протокол SSL 3.0 или TLS 1.0. На сегодняшний день эти протоколы признаны небезопасными и отключены на большинстве серверов. Поскольку в 8.2 отсутствует возможность передать объект ЗащищенноеСоединениеOpenSSL (который появился только в 8.3.3), нам приходится искать альтернативные способы инициации сетевого запроса.
Одним из самых эффективных и быстрых способов решения задачи является использование системных библиотек Windows через механизм COM. Библиотека MSXML2.XMLHTTP позволяет делегировать выполнение HTTP-запроса операционной системе, которая, в отличие от старой платформы 1С, регулярно получает обновления безопасности и поддерживает актуальные версии TLS.
Рассмотрим подробный пример кода для загрузки файла (например, CSV-отчета):
Функция СкачатьФайлЧерезXMLHTTP(URL, ПутьСохранения) Экспорт
// Создаем объект, через который будет выполняться запрос
// Версия 6.0 является наиболее актуальной и стабильной
Попытка
Запрос = Новый COMОбъект("MSXML2.XMLHTTP.6.0");
Исключение
Сообщить("Не удалось создать объект MSXML2.XMLHTTP.6.0. Возможно, библиотека не зарегистрирована.");
Возврат Ложь;
КонецПопытки;
// Инициализируем соединение
// Параметры: Метод (GET), URL, Асинхронность (Ложь - ждем ответа)
Запрос.Open("GET", URL, Ложь);
// Отправляем запрос
Попытка
Запрос.Send();
Исключение
Сообщить("Ошибка при отправке запроса: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
// Проверяем статус ответа сервера (200 - OK)
Если Запрос.Status = 200 Тогда
// Получаем тело ответа. Для бинарных файлов используем responseBody
Данные = Запрос.ResponseBody;
// Для сохранения данных на диск используем объект ADODB.Stream
Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1; // Binary
Поток.Open();
Поток.Write(Данные);
Поток.SaveToFile(ПутьСохранения, 2); // 2 - перезаписывать файл, если существует
Поток.Close();
Возврат Истина;
Иначе
Сообщить("Сервер вернул ошибку: " + Запрос.Status + " " + Запрос.StatusText);
Возврат Ложь;
КонецЕсли;
КонецФункции
В данном примере мы используем MSXML2.XMLHTTP.6.0. Преимущество этого метода в том, что он работает «прозрачно» для пользователя, используя системные настройки сертификатов и протоколов. Однако стоит помнить, что в серверных регламентных заданиях этот объект может вести себя нестабильно из-за привязки к сессии пользователя.
Если предыдущий способ выдает ошибку на стороне сервера (например, если сервер требует строго TLS 1.2, а ОС по умолчанию пытается использовать старый протокол), нам следует применить объект WinHttp.WinHttpRequest.5.1. У этого объекта есть мощный метод SetOption, который позволяет управлять параметрами безопасности.
Проанализируем ситуацию: для включения поддержки TLS 1.2 в Windows через WinHttp необходимо установить флаг WinHttpOption_SecureProtocols. Рассмотрим, как это реализовать в коде 1С:
Процедура ЗагрузитьДанныеСTLS12(АдресРесурса)
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Подготовка запроса
WinHttp.Open("GET", АдресРесурса, Ложь);
// Опция номер 9 отвечает за используемые протоколы безопасности
// Значение 2048 соответствует протоколу TLS 1.2
// Значение 2304 включает одновременно TLS 1.1 и TLS 1.2
Попытка
WinHttp.SetOption(9, 2048);
Исключение
Сообщить("Не удалось установить протокол TLS 1.2. Проверьте обновления ОС.");
КонецПопытки;
// Выполняем запрос
Попытка
WinHttp.Send();
Если WinHttp.Status = 200 Тогда
// Обработка текстового ответа
ТекстОтвета = WinHttp.ResponseText;
Сообщить("Данные получены успешно!");
КонецЕсли;
Исключение
Сообщить("Ошибка соединения через WinHttp: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Важное примечание для системных администраторов: Если вы используете Windows 7 или Windows Server 2008 R2, поддержка TLS 1.2 в WinHttp может быть неактивна на уровне реестра даже при наличии последних обновлений. В этом случае необходимо убедиться, что установлено обновление KB3140245 и внесены соответствующие правки в ветку реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols.
Если работа с COM-объектами кажется избыточной или они блокируются политиками безопасности, можно воспользоваться мощью PowerShell, который встроен во все современные версии Windows. PowerShell базируется на .NET Framework и отлично справляется с загрузкой файлов по защищенным каналам.
Разберем алгоритм вызова PowerShell из кода 1С:
ЗапуститьПриложение.
Процедура СкачатьФайлЧерезPowerShell(URL, ЛокальныйПуть)
// Скрипт устанавливает TLS 1.2 и скачивает файл
ШаблонСкрипта = "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webClient = New-Object Net.WebClient; $webClient.DownloadFile('%1', '%2')";
// Подставляем параметры
КомандаPS = СтрЗаменить(ШаблонСкрипта, "%1", URL);
КомандаPS = СтрЗаменить(КомандаPS, "%2", ЛокальныйПуть);
// Запускаем PowerShell в скрытом режиме
ПолнаяКоманда = "powershell -WindowStyle Hidden -Command """ + КомандаPS + """";
ЗапуститьПриложение(ПолнаяКоманда, , Истина); // Истина - ждать завершения
Файл = Новый Файл(ЛокальныйПуть);
Если Файл.Существует() Тогда
Сообщить("Файл успешно скачан командой PowerShell");
Иначе
Сообщить("Не удалось скачать файл через PowerShell");
КонецЕсли;
КонецПроцедуры
В ситуациях, когда код 1С 8.2 менять крайне нежелательно или запросов очень много, рассмотрим архитектурное решение — использование Stunnel. Это специализированная утилита, которая создает защищенный туннель.
Принцип работы:
localhost без всякого шифрования, что позволяет использовать стандартный HTTPСоединение.Этот метод считается наиболее надежным для высоконагруженных систем, так как снимает нагрузку по шифрованию с платформы 1С и перекладывает её на оптимизированный инструмент.
Проанализировав все варианты, мы можем сделать следующие выводы:
Помните, что безопасность данных — приоритет, и использование современных протоколов шифрования (даже через «костыли» в старых версиях 1С) является обязательным требованием текущего времени.