Как исправить ошибку "peer certificate cannot be authenticated with given CA certificates" при HTTPS-запросах в 1С?

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

При работе с внешними веб-сервисами по протоколу HTTPS из 1С разработчики часто сталкиваются с ошибкой: "Ошибка работы с Интернет: peer certificate cannot be authenticated with given CA certificates". Эта проблема возникает, когда система, на которой выполняется код 1С, не может проверить подлинность SSL-сертификата удаленного сервера. Проще говоря, у 1С нет информации о центре сертификации, который выдал сертификат сайту, и она ему не доверяет.

Давайте подробно разберем, почему это происходит и какие существуют способы решения этой задачи, от простого программного кода до настроек на уровне операционной системы.

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

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

Проанализируем несколько надежных способов исправить эту ситуацию.

Решение 1: Программное создание защищенного соединения через OpenSSL

Это наиболее гибкий и предпочтительный метод, так как он не требует административного доступа к серверу и позволяет управлять соединением непосредственно из кода 1С. Суть метода заключается в явном указании платформе использовать определенные настройки для SSL/TLS соединения.

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

Шаг 1. Создание защищенного соединения

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

Посмотрим на пример кода, который помог автору темы на форуме:


Процедура ОтправитьЗапрос()

    ИмяСервера = "api.example.com";
    Порт = 443; // Стандартный порт для HTTPS
    Таймаут = 30;

    // Создаем объект защищенного соединения. 
    // В данном случае мы не передаем клиентский сертификат или специфичные настройки проверки.
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

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

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

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

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

Решение 2: Использование файла с корневыми сертификатами (cacert.pem)

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

Шаг 1. Получение файла cacert.pem

Самый надежный источник для этого файла — официальный сайт проекта cURL. Файл регулярно обновляется. Его нужно скачать и разместить в доступном месте на сервере или клиенте, откуда будет выполняться код (например, C:\certs\cacert.pem).

Шаг 2. Использование файла в коде 1С

Теперь мы создадим объект ЗащищенноеСоединениеOpenSSL, но передадим ему настройки, указывающие на наш файл.


Процедура ОтправитьЗапросСУказаниемСертификатов()

    ИмяСервера = "api.example.com";
    // Путь к файлу с корневыми сертификатами, который вы скачали
    ПутьКФайлуСертификатов = "C:\certs\cacert.pem"; 

    // Проверяем, существует ли файл
    ФайлСертификатов = Новый Файл(ПутьКФайлуСертификатов);
    Если НЕ ФайлСертификатов.Существует() Тогда
        Сообщить("Файл с корневыми сертификатами не найден по пути: " + ПутьКФайлуСертификатов);
        Возврат;
    КонецЕсли;

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

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

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

Этот подход является самым надежным, так как он не зависит от системного хранилища сертификатов и полностью контролируется из кода. Вы всегда уверены, что используете актуальный список доверенных центров.

Решение 3: Добавление сертификата в хранилище доверенных сертификатов Windows

Этот способ решает проблему на уровне операционной системы. Он подходит, если у вас есть административный доступ к машине (серверу 1С или клиентскому компьютеру) и вы хотите, чтобы все приложения, а не только 1С, доверяли этому сертификату.

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

  1. Экспорт корневого сертификата.

    Откройте проблемный HTTPS-адрес в браузере (например, Chrome или Firefox). Нажмите на иконку замка в адресной строке, перейдите в раздел "Сертификат" или "Подключение защищено". Найдите вкладку "Путь сертификации" (Certification Path). Вам нужна самая верхняя запись в цепочке — это и есть корневой сертификат. Выберите его, нажмите "Просмотр сертификата", перейдите на вкладку "Состав" (Details) и нажмите "Копировать в файл...". Сохраните его в формате "X.509 в кодировке Base-64 (.CER)".

  2. Импорт сертификата в хранилище.

    Нажмите Win+R, введите mmc и нажмите Enter, чтобы открыть консоль управления.

  3. В меню "Файл" выберите "Добавить или удалить оснастку...".

  4. В списке доступных оснасток найдите "Сертификаты", нажмите "Добавить". В открывшемся окне выберите "учетной записи компьютера" (Computer account) и нажмите "Далее". Выберите "Локальный компьютер" (Local computer) и "Готово". Нажмите "ОК", чтобы закрыть окно оснасток.

  5. В дереве слева раскройте узел "Сертификаты (локальный компьютер)" -> "Доверенные корневые центры сертификации" -> "Сертификаты".

  6. Нажмите правой кнопкой мыши на папке "Сертификаты", выберите "Все задачи" -> "Импорт...".

  7. Запустится мастер импорта. Укажите путь к сохраненному ранее файлу .CER и завершите импорт, оставляя все настройки по умолчанию.

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

Дополнительный вопрос: Как передать логин и пароль (Basic-авторизация)?

Часто для доступа к веб-сервису требуется авторизация. В теме форума также был затронут этот вопрос. Самый распространенный метод — Basic-авторизация.

Для этого необходимо сформировать специальный заголовок Authorization.


// Данные для авторизации
ИмяПользователя = "MyUser";
Пароль = "MyPassword";

// 1. Формируем строку "Пользователь:Пароль"
СтрокаАвторизации = ИмяПользователя + ":" + Пароль;

// 2. Кодируем эту строку в Base64
СтрокаBase64 = Base64Строка(СтрокаАвторизации);

// 3. Создаем HTTP-запрос и добавляем заголовок
Запрос = Новый HTTPЗапрос("/api/protected-resource");
Запрос.Заголовки.Вставить("Authorization", "Basic " + СтрокаBase64);

// 4. Отправляем запрос через ранее созданное соединение
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Таким образом, мы передаем учетные данные в закодированном виде, как того требует стандарт Basic-авторизации.

В заключение, выбор метода решения зависит от ваших прав доступа и требований к гибкости. Программный способ с ЗащищенноеСоединениеOpenSSL и файлом cacert.pem является наиболее универсальным и переносимым решением для разработчика 1С.

← На главную