При выполнении HTTP-выгрузки данных из 1С мы часто сталкиваемся с необходимостью взаимодействия с внешними веб-сервисами. Иногда при попытке отправить запрос по протоколу HTTP сервер возвращает код состояния 301. Это означает, что запрошенный ресурс был окончательно перемещен на новый URL-адрес, который, как правило, указывает на защищенное соединение по протоколу HTTPS. Данная ситуация является стандартной практикой для обеспечения безопасности передачи данных.
Давайте разберем, как эффективно решать эту проблему, особенно учитывая различия в возможностях платформ 1С 8.2 и 8.3 в работе с защищенными соединениями.
Представим, что мы пытаемся отправить POST-запрос на адрес вида https://api.mindbox.ru/v3/operations/bulk?..., используя объект HTTPСоединение. Изначально мы можем ошибочно попытаться подключиться по HTTP:
ИмяСервера = "api.mindbox.ru";
СсылкаНаРесурс = "/v3/operations/bulk?endpointId=FinAppOffline&operation=DirectCrm.PointsOfContacts.Import&csvCodePage=65001";
// Вариант 1: Использование HTTPСоединение без явного указания защищенного соединения
HTTP = Новый HTTPСоединение(ИмяСервера);
ФайлТелаЗапроса = ПолучитьИмяВременногоФайла();
// ... Запись данных в ФайлТелаЗапроса ...
ФайлРезультатИсполнения = ПолучитьИмяВременногоФайла();
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить("Authorization", "Mindbox secretKey=""Y78952UE7a5S""");
ЗаголовокЗапросаHTTP.Вставить("Accept","application/json");
ЗаголовокЗапросаHTTP.Вставить("Content-Type", "text/csv;charset=utf-8");
Ответ = HTTP.ОтправитьДляОбработки(ФайлТелаЗапроса, СсылкаНаРесурс, ФайлРезультатИсполнения, ЗаголовокЗапросаHTTP);
КодСостояния = Ответ.КодСостояния; // Возвращает 301
В этом случае, как мы видим, КодСостояния возвращает 301. Это говорит нам о том, что сервер не принял наш запрос по HTTP, а вместо этого перенаправил нас на HTTPS-версию того же адреса. Мы можем убедиться в этом, проанализировав заголовок location в ответе, который будет содержать URL с https://.
Для платформ 1С версии 8.3 и выше (начиная с определенных релизов), у нас есть мощный инструмент для работы с HTTPS — объект ЗащищенноеСоединениеOpenSSL. Этот объект позволяет установить защищенное соединение, обеспечивая необходимый уровень шифрования и проверки сертификатов.
Для того чтобы использовать HTTPS, нам необходимо создать экземпляр ЗащищенноеСоединениеOpenSSL и передать его в конструктор HTTPСоединение в качестве последнего параметра. Также мы должны явно указать порт 443, который является стандартным для HTTPS.
ИмяСервера = "api.mindbox.ru";
СсылкаНаРесурс = "/v3/operations/bulk?endpointId=FinAppOffline&operation=DirectCrm.PointsOfContacts.Import&csvCodePage=65001";
ПортHTTPS = 443; // Стандартный порт для HTTPS
// Создаем защищенное соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
// Инициализируем HTTPСоединение с использованием защищенного соединения и порта HTTPS
// Обратите внимание на 7-й параметр конструктора HTTPСоединение, куда передается ЗащищенноеСоединение
HTTP = Новый HTTPСоединение(ИмяСервера, ПортHTTPS, , , , , ЗащищенноеСоединение);
ФайлТелаЗапроса = ПолучитьИмяВременногоФайла();
Текст.Записать(ФайлТелаЗапроса, КодировкаТекста.ANSI); // Предполагается, что Текст - это объект ТекстовыйДокумент
ФайлРезультатИсполнения = ПолучитьИмяВременногоФайла();
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить("Authorization", "Mindbox secretKey=""YS7852awsXJBCgUE7a5S""");
ЗаголовокЗапросаHTTP.Вставить("Accept","application/json");
ЗаголовокЗапросаHTTP.Вставить("Content-Type", "text/csv;charset=utf-8");
Ответ = HTTP.ОтправитьДляОбработки(ФайлТелаЗапроса, СсылкаНаРесурс, ФайлРезультатИсполнения, ЗаголовокЗапросаHTTP);
КодСостояния = Ответ.КодСостояния;
// Если все настроено верно, КодСостояния будет 200 (OK) или другим кодом успешного выполнения операции.
Как мы видим, такой подход успешно решает проблему для 1С 8.3. Теперь наше соединение будет устанавливаться по HTTPS, и сервер будет обрабатывать запрос корректно.
Ситуация усложняется, если наша обработка должна работать и под платформой 1С 8.2. В версии 8.2 объект ЗащищенноеСоединениеOpenSSL отсутствует. Вместо него в конструкторе HTTPСоединение есть булевый параметр, который можно установить в Истина для указания защищенного соединения:
HTTP = Новый HTTPСоединение(ИмяСервера, 443, , , , , Истина); // порт 443 - для https
Однако, при попытке выполнить запрос с такой настройкой в 1С 8.2, мы сталкиваемся с новой ошибкой: «Ошибка работы с Интернет: SSL connect error». Это указывает на то, что, хотя мы и указали необходимость защищенного соединения, платформа 1С 8.2 не смогла установить его должным образом.
Давайте подробно рассмотрим основные причины возникновения ошибки «SSL connect error» при работе с HTTPS-соединениями в 1С 8.2:
Устаревшие версии протоколов SSL/TLS: 1С 8.2 может использовать более старые версии протоколов SSL/TLS (например, только SSL 3.0 или более ранние версии TLS), которые уже не поддерживаются современными веб-серверами. Многие серверы отключают устаревшие и менее безопасные протоколы (например, SSL 3.0), оставляя только TLS 1.1, 1.2 или даже 1.3. Если 1С пытается установить соединение по протоколу, который сервер отклоняет, возникает ошибка.
Проблемы с сертификатами: Для успешного защищенного соединения требуется корректная проверка сертификата сервера. Если корневой сертификат, которым подписан сертификат целевого сервера (например, Mindbox), отсутствует в хранилище доверенных сертификатов операционной системы, или если сертификат устарел/недействителен, соединение не будет установлено. 1С 8.2 полагается на системное хранилище сертификатов Windows.
Настройки прокси-сервера или фаервола: Промежуточное сетевое оборудование (например, корпоративный прокси-сервер) или антивирусное программное обеспечение могут перехватывать, проверять или модифицировать SSL-трафик. Это может привести к тому, что 1С получит измененный или некорректный сертификат, или же соединение будет просто разорвано. Если 1С работает через прокси-сервер, который не настроен для корректной работы с HTTPS (например, не пробрасывает SSL-туннели или использует собственные сертификаты), это может вызвать ошибку. Точно так же фаервол может блокировать исходящие HTTPS-соединения.
Использование устаревших криптографических алгоритмов: Даже если протокол TLS поддерживается, 1С 8.2 может не поддерживать современные алгоритмы шифрования (шифры), используемые сервером. Это приводит к невозможности согласования параметров защищенного соединения между клиентом (1С) и сервером.
Поскольку прямые механизмы работы с современными SSL/TLS протоколами в 1С 8.2 ограничены, нам приходится использовать обходные пути. Давайте рассмотрим подробнее каждый из них.
Если есть такая возможность, обновление платформы 1С до версии 8.3.* является наиболее предпочтительным и кардинальным решением. Начиная с определенных релизов 8.3, появляется объект ЗащищенноеСоединениеOpenSSL, который обеспечивает полноценную поддержку современных протоколов TLS (1.1, 1.2, 1.3) и корректную работу с сертификатами. Это избавляет нас от большинства проблем, связанных с устаревшими протоколами и шифрами.
В некоторых случаях проблему можно решить, убедившись, что операционная система Windows, на которой работает 1С 8.2, корректно настроена для использования современных версий TLS, в частности TLS 1.2. 1С 8.2 полагается на криптографические библиотеки операционной системы. Если на сервере или рабочей станции, где запущена 1С, отключены или неактивны современные версии TLS, это может быть причиной ошибки.
Включение TLS 1.2 может потребовать внесения изменений в реестр Windows. Мы можем проверить и настроить следующие разделы реестра:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
Аналогичные изменения могут потребоваться для TLS 1.1. После изменений в реестре обязательно перезагрузите операционную систему, чтобы изменения вступили в силу.
Для более гибкой работы с HTTP/HTTPS в 1С 8.2 мы можем использовать внешние компоненты или встроенные COM-объекты Windows.
WinHttpRequest: Это COM-объект, который является частью операционной системы Windows и предоставляет широкие возможности для настройки HTTP/HTTPS запросов, включая указание версий SSL/TLS и управление сертификатами. Работа с ним из 1С требует написания кода для взаимодействия с COM-объектом.
Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
Исключение
Сообщить("Не удалось создать COM-объект WinHttp.WinHttpRequest. Возможно, не зарегистрирован.");
Возврат;
КонецПопытки;
WinHttp.Open("POST", "https://api.mindbox.ru/v3/operations/bulk?endpointId=FinAppOffline&operation=DirectCrm.PointsOfContacts.Import&csvCodePage=65001", Ложь);
WinHttp.SetRequestHeader("Authorization", "Mindbox secretKey=""YS7852awsXJBCgUE7a5S""");
WinHttp.SetRequestHeader("Accept", "application/json");
WinHttp.SetRequestHeader("Content-Type", "text/csv;charset=utf-8");
// Можно настроить опции SSL/TLS, например, игнорировать ошибки сертификатов (не рекомендуется для продакшена)
// WinHttp.Option(2, 13056); // WINHTTP_OPTION_SECURITY_FLAGS, WINHTTP_FLAG_SECURE_ACCEPT_REVOKED_CERT + WINHTTP_FLAG_SECURE_ANY_CA + WINHTTP_FLAG_SECURE_NATIVE_MODE
// Если есть тело запроса
ТелоЗапросаСтрока = "email,firstName,lastName" + Символы.ПС + "test@example.com,Иван,Иванов";
WinHttp.Send(ТелоЗапросаСтрока);
// Получаем ответ
КодСостояния = WinHttp.Status;
ТекстОтвета = WinHttp.ResponseText;
Сообщить("Код состояния: " + КодСостояния);
Сообщить("Текст ответа: " + ТекстОтвета);
Использование WinHttpRequest позволяет обойти многие ограничения 1С 8.2, так как он использует системные настройки Windows для SSL/TLS. Нам важно удостовериться, что на компьютере, где выполняется код, корректно зарегистрирован COM-объект и настроены системные протоколы TLS.
Программа Stunnel может выступать в роли SSL/TLS прокси-сервера. Она устанавливает защищенное соединение с внешним HTTPS-сервером, а затем предоставляет локальный HTTP-интерфейс, к которому обращается 1С.
Как это работает:
Stunnel на машине, где работает 1С.Stunnel мы указываем внешний HTTPS-сервер (например, api.mindbox.ru:443).Stunnel будет слушать запросы на локальном порту (например, 127.0.0.1:8080) по HTTP.127.0.0.1:8080.Stunnel перехватывает этот запрос, оборачивает его в SSL/TLS и пересылает на внешний api.mindbox.ru:443.Stunnel расшифровывает и передает обратно в 1С по HTTP.Этот подход позволяет 1С работать с локальным HTTP-соединением, в то время как всю сложность HTTPS берет на себя Stunnel, который использует современные криптографические библиотеки.
Иногда ошибка «SSL connect error» связана с тем, что в хранилище доверенных корневых сертификатов Windows отсутствует сертификат удостоверяющего центра, который выдал сертификат целевого сервера. Мы можем вручную загрузить корневой сертификат сервера Mindbox (или любого другого целевого сервиса) и установить его в хранилище доверенных корневых сертификатов Windows на машине, где работает 1С. Это позволит операционной системе (и, соответственно, 1С 8.2) доверять сертификату сервера.
Для этого:
Если ни один из вышеперечисленных методов не подходит или требуется более надежное и гибкое решение, мы можем создать небольшой микросервис на другом языке программирования (например, Go, Python, Node.js), который будет выступать в роли прокси. 1С будет отправлять обычные HTTP-запросы этому микросервису (например, на локальный порт 8000), а микросервис будет выполнять защищенные HTTPS-запросы к целевому серверу (Mindbox) и возвращать результат обратно в 1С.
Этот подход имеет несколько преимуществ:
Это наиболее сложное в реализации решение, но оно обеспечивает максимальную гибкость и независимость от возможностей платформы 1С.
Мы выяснили, что ошибка 301 при HTTP-выгрузке в 1С указывает на необходимость использования HTTPS. Для 1С 8.3 проблема легко решается с помощью объекта ЗащищенноеСоединениеOpenSSL. Однако для 1С 8.2, из-за ограничений платформы и использования устаревших криптографических возможностей, мы сталкиваемся с «SSL connect error».
Мы рассмотрели несколько подходов к решению этой проблемы для 1С 8.2: от обновления платформы и настройки ОС до использования COM-объектов, прокси-серверов или разработки собственных микросервисов. Выбор конкретного метода зависит от имеющихся ресурсов, требований к безопасности и сложности проекта. Важно анализировать причины ошибки и выбирать наиболее подходящее решение для вашей конкретной ситуации.