Как настроить HTTPS соединение в 1С и исправить ошибку проверки сертификата SSL?

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

При интеграции 1С со сторонними веб-сервисами, интернет-магазинами или API для обмена данными (для мониторинга обменов пригодится расширение для логирования и анализа HTTP-запросов в 1С) часто возникает необходимость использования защищенного протокола HTTPS. Нередко разработчики сталкиваются с ситуацией, когда код, корректно работающий с HTTP, перестает работать при переходе на HTTPS, или же соединение работает в Postman/браузере, но выдает ошибку в 1С:Предприятие.

В этой статье мы подробно разберем, почему возникают ошибки вида "Удаленный узел не прошел проверку", "The remote certificate is invalid according to the validation procedure" и как правильно настроить HTTPСоединение для работы с защищенными ресурсами. Проанализируем типовые ошибки и пошагово реализуем их решение.

Основные причины ошибок при работе с HTTPS

Когда мы пытаемся установить соединение с защищенным ресурсом, платформа 1С выполняет проверку SSL-сертификата сервера. Если проверка не проходит, платформа разрывает соединение, генерируя исключение. Рассмотрим основные причины, по которым это происходит:

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

Давайте разберем каждое из этих условий и способы их устранения.

Правильное создание HTTP-соединения

Первое, с чего мы начнем — это проверка кода создания соединения. Для работы по протоколу HTTPS недостаточно просто указать порт 443. Необходимо явно передать в конструктор объект, отвечающий за параметры защиты.

Посмотрим на пример правильного создания соединения:


// Определяем параметры подключения
Хост = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS

// Создаем описание защищенного соединения
// Именно этот объект говорит платформе, что мы используем SSL/TLS
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентровWindows());

// Инициализируем соединение
Соединение = Новый HTTPСоединение(Хост, Порт, , , , , Защита);

Обратите внимание на использование объекта ЗащищенноеСоединениеOpenSSL. Если вы не передадите этот параметр (или передадите Неопределено), 1С будет пытаться установить обычное незащищенное соединение, что приведет к ошибке при обращении к порту 443.

Проблема доверия к сертификатам

Наиболее частая проблема, с которой сталкиваются разработчики, звучит так: "В браузере ссылка открывается, замочек зеленый, а 1С выдает ошибку сертификата". Разберем, почему так происходит.

Браузеры (Chrome, Firefox, Edge) и операционная система Windows имеют свои встроенные и регулярно обновляемые списки доверенных корневых центров сертификации. Платформа 1С использует свой собственный механизм хранения доверенных сертификатов, который может отличаться от системного.

В платформе 1С список доверенных сертификатов хранится в специальном файле cacert.pem. Если сертификат сайта (или корневой сертификат, который его подписал) отсутствует в этом файле, 1С считает соединение небезопасным и блокирует его.

Решение 1: Использование системного хранилища Windows

Если ваш сервер работает под управлением ОС Windows, самым простым способом решения часто является указание платформе использовать системное хранилище сертификатов. В коде выше мы уже применили этот метод:


Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентровWindows());

Конструктор СертификатыУдостоверяющихЦентровWindows заставляет 1С обращаться к хранилищу сертификатов Windows. Если сертификат валиден с точки зрения Internet Explorer/Edge на этом сервере, то и 1С должна его принять.

Важно: Этот метод работает только на платформе Windows и может требовать, чтобы пользователь, под которым запущен сервер 1С (обычно USR1CV8), имел доступ к хранилищу сертификатов.

Решение 2: Ручное добавление сертификата в cacert.pem

Если первый способ не помог (например, используется Linux-сервер 1С или специфический удостоверяющий центр), нам необходимо вручную добавить сертификат целевого сайта в доверенные сертификаты платформы. Рассмотрим этот процесс по шагам.

Шаг 1: Выгрузка сертификата сайта

Для начала нам нужно получить сам файл сертификата. Сделаем это через браузер:

  1. Откройте сайт (API), к которому нужно подключиться, в браузере.
  2. Нажмите на значок "замка" в адресной строке рядом с URL.
  3. Выберите пункт "Просмотр сертификата" (или "Подробнее").
  4. Перейдите на вкладку "Путь сертификации" или "Подробно". Рекомендуется выгружать Корневой сертификат (самый верхний в иерархии), так как он меняется реже всего.
  5. Нажмите "Копировать в файл..." или "Экспорт".
  6. Выберите формат Base-64 encoded X.509 (.CER). Это критически важно, так как 1С работает именно с этим форматом.
  7. Сохраните файл на диск, например, под именем mysite.cer.

Шаг 2: Редактирование файла cacert.pem

Теперь добавим полученный сертификат в хранилище платформы.

Найдем файл конфигурации. Обычно он располагается по пути:

C:\Program Files\1cv8\8.3.XX.XXXX\bin\cacert.pem

Где 8.3.XX.XXXX — это конкретная версия вашей платформы. Если у вас клиент-серверный вариант, эту операцию нужно проделывать на компьютере, где установлен Сервер 1С.

Порядок действий:

  1. Сделайте резервную копию файла cacert.pem.
  2. Откройте сохраненный на Шаге 1 файл mysite.cer с помощью Блокнота.
  3. Вы увидите текст, начинающийся с -----BEGIN CERTIFICATE----- и заканчивающийся -----END CERTIFICATE-----. Скопируйте всё содержимое, включая эти строки.
  4. Откройте файл cacert.pem с помощью Блокнота (потребуются права администратора).
  5. Перейдите в самый конец файла, добавьте новую пустую строку и вставьте скопированный текст сертификата.
  6. Сохраните файл cacert.pem.
  7. Перезапустите службу Агента сервера 1С. Это обязательное действие, так как платформа кэширует сертификаты при старте.

После выполнения этих действий 1С начнет "доверять" вашему ресурсу, и метод HTTPСоединение отработает корректно.

Решение 3: Игнорирование ошибок SSL (Только для отладки)

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

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

Однако существует альтернативный способ создания объекта для игнорирования ошибок сертификации (работает не на всех версиях платформы одинаково стабильно, используйте с осторожностью):


// Создаем защищенное соединение с новым сертификатом клиента (если нужно) 
// и сертификатами удостоверяющих центров
SSL = Новый ЗащищенноеСоединениеOpenSSL(
    Новый СертификатКлиентаWindows(), // Клиентский сертификат
    Новый СертификатыУдостоверяющихЦентровФайл("путь_к_пустому_или_спец_файлу") 
);

Впрочем, лучшей практикой для "игнорирования" является создание своего файла сертификатов (как в Решении 2), содержащего именно тот "неправильный" или самоподписанный сертификат, которому вы хотите доверять, вместо того чтобы отключать проверку глобально.

Пример полного кода функции подключения

Давайте соберем всё воедино и напишем универсальную функцию для отправки GET-запроса, которая учитывает нюансы HTTPS.


Функция ОтправитьЗапросНаСервер(АдресРесурса, ТокенДоступа) Экспорт
    
    Сервер = "api.myservice.com";
    Ресурс = "/v1/orders/" + АдресРесурса;
    
    // Настраиваем SSL
    // Вариант 1: Доверяем хранилищу Windows
    Защита = Новый ЗащищенноеСоединениеOpenSSL( , Новый СертификатыУдостоверяющихЦентровWindows());
    
    // Вариант 2 (Если правили cacert.pem):
    // Защита = Новый ЗащищенноеСоединениеOpenSSL(); 
    
    Попытка
        Соединение = Новый HTTPСоединение(Сервер, 443, , , , 15, Защита);
        
        Заголовки = Новый Соответствие;
        Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
        Заголовки.Вставить("Content-Type", "application/json");
        
        ЗапросHTTP = Новый HTTPЗапрос(Ресурс, Заголовки);
        
        Ответ = Соединение.Получить(ЗапросHTTP);
        
        Если Ответ.КодСостояния = 200 Тогда
            Возврат Ответ.ПолучитьТелоКакСтроку();
        Иначе
            Сообщить("Ошибка сервера: " + Ответ.КодСостояния + " " + Ответ.ПолучитьТелоКакСтроку());
        КонецЕсли;
        
    Исключение
        Информация = ИнформацияОбОшибке();
        Сообщить("Не удалось установить соединение: " + ПодробноеПредставлениеОшибки(Информация));
        // Здесь можно добавить запись в Журнал Регистрации
    КонецПопытки;
    
    Возврат Неопределено;

КонецФункции

Диагностика проблем

Если после всех настроек соединение не устанавливается, проанализируем возможные дополнительные факторы:

Используя приведенные выше методы, вы сможете успешно настроить безопасный обмен данными между 1С и внешними системами.

← На главную