Как скачать файл по протоколу HTTPS в 1С:Предприятие 8.2 при ошибке SSL?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Разработчики, работающие на платформе 1С:Предприятие 8.2, часто сталкиваются с критической проблемой при попытке обмена данными с современными веб-сервисами. При использовании стандартного объекта HTTPСоединение возникает системная ошибка: "Ошибка работы с Интернет: SSL connect error". Причина этой ситуации кроется в том, что платформа 8.2 была выпущена в то время, когда стандарты шифрования были значительно слабее. Современные сайты и государственные порталы давно перешли на протоколы TLS 1.2 и TLS 1.3, которые встроенные механизмы 8.2 просто «не понимают» на программном уровне.

В этой статье мы подробно разберем, как обойти это ограничение, не прибегая к экстренному обновлению всей информационной базы на платформу 8.3. Мы проанализируем использование системных COM-объектов, внешних утилит и специализированных прокси-серверов.

Причина возникновения ошибки SSL в 8.2

Прежде чем перейти к решениям, выясним причину проблемы. Объект HTTPСоединение в версии 8.2 использует старые библиотеки OpenSSL, которые поддерживают максимум протокол SSL 3.0 или TLS 1.0. На сегодняшний день эти протоколы признаны небезопасными и отключены на большинстве серверов. Поскольку в 8.2 отсутствует возможность передать объект ЗащищенноеСоединениеOpenSSL (который появился только в 8.3.3), нам приходится искать альтернативные способы инициации сетевого запроса.

Способ 1. Использование COM-объекта MSXML2.XMLHTTP

Одним из самых эффективных и быстрых способов решения задачи является использование системных библиотек 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. Преимущество этого метода в том, что он работает «прозрачно» для пользователя, используя системные настройки сертификатов и протоколов. Однако стоит помнить, что в серверных регламентных заданиях этот объект может вести себя нестабильно из-за привязки к сессии пользователя.

Способ 2. Использование WinHttp.WinHttpRequest и принудительное включение TLS 1.2

Если предыдущий способ выдает ошибку на стороне сервера (например, если сервер требует строго 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.

Способ 3. Использование PowerShell как универсального загрузчика

Если работа с COM-объектами кажется избыточной или они блокируются политиками безопасности, можно воспользоваться мощью PowerShell, который встроен во все современные версии Windows. PowerShell базируется на .NET Framework и отлично справляется с загрузкой файлов по защищенным каналам.

Разберем алгоритм вызова PowerShell из кода 1С:

  1. Сформируем строку скрипта, которая устанавливает протокол безопасности и скачивает файл.
  2. Запустим выполнение через команду ЗапуститьПриложение.
  3. Дождемся появления файла на диске.

Процедура СкачатьФайлЧерез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");
    КонецЕсли;

КонецПроцедуры

Способ 4. Использование прокси-туннеля (Stunnel)

В ситуациях, когда код 1С 8.2 менять крайне нежелательно или запросов очень много, рассмотрим архитектурное решение — использование Stunnel. Это специализированная утилита, которая создает защищенный туннель.

Принцип работы:

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

Резюме и рекомендации

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

  1. Для простых задач в интерактивном режиме (в формах) лучше всего подходит MSXML2.XMLHTTP.6.0.
  2. Для серверных скриптов и строгой настройки TLS 1.2 используйте WinHttp.WinHttpRequest.5.1 с опцией 9.
  3. Если нужно быстро «набросать» решение без регистрации COM-объектов — PowerShell ваш лучший помощник.
  4. В сложных корпоративных средах с жесткими требованиями к безопасности оптимальным выбором станет настройка Stunnel.

Помните, что безопасность данных — приоритет, и использование современных протоколов шифрования (даже через «костыли» в старых версиях 1С) является обязательным требованием текущего времени.

← На главную