Как решить проблему с SSL/TLS соединением при выполнении HTTP-запросов в 1С 8.3?

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

В современной разработке на платформе 1С:Предприятие 8.3 взаимодействие с внешними сервисами через HTTP-запросы стало стандартом. Однако при переходе сервисов на защищенные протоколы (HTTPS) программисты часто сталкиваются с ошибками вида "Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: Удаленный узел не прошел проверку" — для упрощения диагностики подобных ошибок есть расширение для логирования и анализа HTTP-запросов. В рамках данной статьи мы подробно разберем, как правильно настроить защищенное соединение, разберемся с сертификатами и напишем отказоустойчивый код.

Анализируем причину возникновения ошибки

Прежде чем приступать к написанию кода, давайте разберем, почему возникает эта проблема. Когда 1С обращается к стороннему ресурсу по протоколу HTTPS, платформа пытается проверить подлинность SSL-сертификата удаленного сервера. Если сертификат самоподписанный, срок его действия истек или цепочка сертификатов (Chain of Trust) не является полной, встроенные механизмы безопасности блокируют соединение. Проанализируем типичные ситуации: отсутствие корневых сертификатов в хранилище платформы или использование устаревших версий TLS, которые не поддерживаются сервером.

Использование объекта ЗащищенноеСоединениеOpenSSL

Для реализации защищенного обмена данными в 1С предусмотрен специальный объект ЗащищенноеСоединениеOpenSSL. Он позволяет указать платформе, какие сертификаты использовать для проверки и нужно ли игнорировать ошибки проверки, если мы доверяем узлу. Рассмотрим стандартный способ инициализации такого соединения, который подходит для большинства задач.

Для начала создадим объект защиты. Мы можем инициализировать его без параметров, тогда 1С будет использовать системное хранилище сертификатов операционной системы. Разберем этот пример:


// Инициализация стандартного защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// Создание HTTPСоединения с использованием объекта защиты
Соединение = Новый HTTPСоединение("api.service.ru", 
                                 443, 
                                 Логин, 
                                 Пароль, 
                                 , 
                                 30, 
                                 Защита);

Однако на практике часто требуется более тонкая настройка. Если сервер использует сложную схему авторизации, например Google OAuth 2.0 на обычных формах, или требует самоподписанный сертификат, нам необходимо явно передать его платформе. Посмотрим, как это сделать, используя сертификаты из файлов.

Работа с файлами сертификатов и закрытыми ключами

Рассмотрим ситуацию, когда внешнее API требует авторизации не только по логину, но и по клиентскому сертификату. В этом случае нам нужно передать в конструктор ЗащищенноеСоединениеOpenSSL два объекта: СертификатКлиентаWindows или СертификатКлиентаOpenSSL, а также СертификатыУдостоверяющихЦентровOpenSSL. Подобная криптография в 1С часто применяется для обеспечения безопасности передаваемых данных.

Разберем по шагам процесс подключения сертификата из файла формата .pfx или .pem. Это особенно актуально, когда требуется получение токена авторизации RuStore с подписью RSA, где необходимо использовать специфические алгоритмы хеширования. Проанализируем следующий программный код:


// Укажем пути к файлам сертификатов
ПутьКСертификату = "C:\Cert\client.crt";
ПутьККлючу = "C:\Cert\client.key";
ПарольККлючу = "StrongPassword123";

// Создаем объект для сертификата клиента
СертификатКл = Новый СертификатКлиентаOpenSSL(ПутьКСертификату, ПутьККлючу, ПарольККлючу);

// Если нужно добавить корневой сертификат сервера (CA)
ПутьККорневому = "C:\Cert\ca.crt";
СертификатыУЦ = Новый СертификатыУдостоверяющихЦентровOpenSSL(ПутьККорневому);

// Инициализируем защищенное соединение с заданными параметрами
Защита = Новый ЗащищенноеСоединениеOpenSSL(СертификатКл, СертификатыУЦ);

// Выполняем запрос
Запрос = Новый HTTPЗапрос("/v1/get_data");
Попытка
    Ответ = Соединение.Получить(Запрос);
    Сообщить("Код состояния: " + Ответ.КодСостояния);
Исключение
    Сообщить("Ошибка при выполнении запроса: " + ОписаниеОшибки());
КонецПопытки;

Игнорирование ошибок проверки сертификатов

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

Выясним причину, почему это работает: платформа позволяет передать неопределенные параметры в конструктор, что заставляет 1С доверять любому сертификату. Посмотрим на упрощенную инициализацию:


// Создание соединения, которое не проверяет валидность сертификата сервера
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
// Теперь 1С не будет ругаться на "Удаленный узел не прошел проверку"

Настройка сертификатов на стороне сервера (Linux)

Если ваша база 1С работает на сервере под управлением Linux, работа с защищенными соединениями имеет свои особенности. Платформа ищет файл корневых сертификатов в определенных каталогах. Разберем, как обновить этот список, если соединение упорно не устанавливается. Чаще всего 1С обращается к файлу cacert.pem, расположенному в каталоге установки платформы (например, /opt/1cv8/x86_64/8.3.XX.XXXX/bin/cacert.pem).

Проанализируем алгоритм действий для Linux-сервера:

  1. Найдите актуальный набор корневых сертификатов (его можно скачать с сайта curl.se).
  2. Сделайте резервную копию текущего файла cacert.pem.
  3. Замените файл новым или добавьте содержимое вашего сертификата в конец существующего файла.
  4. Перезапустите службу сервера 1С (systemctl restart srv1cv83).

Комплексный пример: отправка POST-запроса с JSON

Для закрепления материала рассмотрим полноценный пример: формирование JSON-тела, настройку заголовков и отправку через защищенное соединение. Проанализируем структуру кода, которая часто используется в таких задачах, как разрешительный режим Честный знак для онлайн проверки — для реализации подобных интеграций есть готовый модуль отправки уведомлений в Telegram.


// Подготовка данных
ДанныеСтруктура = Новый Структура;
ДанныеСтруктура.Вставить("id", 101);
ДанныеСтруктура.Вставить("status", "active");

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеСтруктура);
СтрокаJSON = ЗаписьJSON.Закрыть();

// Настройка соединения
Сервер = "api.mysite.com";
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443, , , , 15, Защита);

// Формирование запроса
Запрос = Новый HTTPЗапрос("/api/v2/update");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);

// Отправка и обработка
Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        Сообщить("Данные успешно отправлены!");
    Иначе
        Сообщить("Ошибка сервера. Код: " + Ответ.КодСостояния);
        Сообщить("Текст ответа: " + Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
Исключение
    Сообщить("Сетевая ошибка или проблема с SSL: " + ОписаниеОшибки());
КонецПопытки;

Типичные ошибки и способы их диагностики

Разберем, на что еще стоит обратить внимание. Если вы используете Windows, убедитесь, что в системе установлены последние обновления безопасности. Устаревшие версии Windows не поддерживают современные шифры TLS 1.2 и 1.3, без которых невозможна, например, надежная интеграция 1С с Google Таблицами через сервисный аккаунт.

Также важно проверить настройки прокси-сервера. Если в вашей компании доступ в интернет осуществляется через прокси, его необходимо указать в объекте HTTPСоединение. Неверная настройка прокси часто маскируется под ошибку SSL. В некоторых случаях для успешного прохождения проверки может потребоваться реализовать механизм Access и Refresh токен аутентификации.

Рассмотрим использование объекта ИнтернетПрокси совместно с защищенным соединением:


Прокси = Новый ИнтернетПрокси;
Прокси.Установить("https", "192.168.1.1", 8080, "proxy_user", "password");

// Добавляем прокси в параметры соединения
Соединение = Новый HTTPСоединение(Сервер, 443, , , Прокси, 10, Защита);

Подводя итог, можно сказать, что правильная работа с SSL в 1С требует понимания того, как платформа взаимодействует с сертификатами. Используя объект ЗащищенноеСоединениеOpenSSL и правильно управляя сертификатами удостоверяющих центров, мы можем построить надежную и безопасную систему интеграции.

← На главную