При интеграции 1С со сторонними веб-сервисами, интернет-магазинами или API для обмена данными (для мониторинга обменов пригодится расширение для логирования и анализа HTTP-запросов в 1С) часто возникает необходимость использования защищенного протокола HTTPS. Нередко разработчики сталкиваются с ситуацией, когда код, корректно работающий с HTTP, перестает работать при переходе на HTTPS, или же соединение работает в Postman/браузере, но выдает ошибку в 1С:Предприятие.
В этой статье мы подробно разберем, почему возникают ошибки вида "Удаленный узел не прошел проверку", "The remote certificate is invalid according to the validation procedure" и как правильно настроить HTTPСоединение для работы с защищенными ресурсами. Проанализируем типовые ошибки и пошагово реализуем их решение.
Когда мы пытаемся установить соединение с защищенным ресурсом, платформа 1С выполняет проверку SSL-сертификата сервера. Если проверка не проходит, платформа разрывает соединение, генерируя исключение. Рассмотрим основные причины, по которым это происходит:
ЗащищенноеСоединениеOpenSSL в конструкторе соединения.Давайте разберем каждое из этих условий и способы их устранения.
Первое, с чего мы начнем — это проверка кода создания соединения. Для работы по протоколу 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С считает соединение небезопасным и блокирует его.
Если ваш сервер работает под управлением ОС Windows, самым простым способом решения часто является указание платформе использовать системное хранилище сертификатов. В коде выше мы уже применили этот метод:
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентровWindows());
Конструктор СертификатыУдостоверяющихЦентровWindows заставляет 1С обращаться к хранилищу сертификатов Windows. Если сертификат валиден с точки зрения Internet Explorer/Edge на этом сервере, то и 1С должна его принять.
Важно: Этот метод работает только на платформе Windows и может требовать, чтобы пользователь, под которым запущен сервер 1С (обычно USR1CV8), имел доступ к хранилищу сертификатов.
Если первый способ не помог (например, используется Linux-сервер 1С или специфический удостоверяющий центр), нам необходимо вручную добавить сертификат целевого сайта в доверенные сертификаты платформы. Рассмотрим этот процесс по шагам.
Для начала нам нужно получить сам файл сертификата. Сделаем это через браузер:
mysite.cer.Теперь добавим полученный сертификат в хранилище платформы.
Найдем файл конфигурации. Обычно он располагается по пути:
C:\Program Files\1cv8\8.3.XX.XXXX\bin\cacert.pem
Где 8.3.XX.XXXX — это конкретная версия вашей платформы. Если у вас клиент-серверный вариант, эту операцию нужно проделывать на компьютере, где установлен Сервер 1С.
Порядок действий:
cacert.pem.mysite.cer с помощью Блокнота.-----BEGIN CERTIFICATE----- и заканчивающийся -----END CERTIFICATE-----. Скопируйте всё содержимое, включая эти строки.cacert.pem с помощью Блокнота (потребуются права администратора).cacert.pem.После выполнения этих действий 1С начнет "доверять" вашему ресурсу, и метод HTTPСоединение отработает корректно.
В процессе разработки или тестирования иногда требуется быстро подключиться к ресурсу, игнорируя ошибки проверки сертификатов (например, на тестовом контуре с самоподписанными сертификатами). Проанализируем, как это можно сделать.
Для этого в объекте ЗащищенноеСоединение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 Тогда
Возврат Ответ.ПолучитьТелоКакСтроку();
Иначе
Сообщить("Ошибка сервера: " + Ответ.КодСостояния + " " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Информация = ИнформацияОбОшибке();
Сообщить("Не удалось установить соединение: " + ПодробноеПредставлениеОшибки(Информация));
// Здесь можно добавить запись в Журнал Регистрации
КонецПопытки;
Возврат Неопределено;
КонецФункции
Если после всех настроек соединение не устанавливается, проанализируем возможные дополнительные факторы:
HTTPСоединение (объект ИнтернетПрокси).rphost (для серверного варианта) не блокируются средствами защиты сети.Используя приведенные выше методы, вы сможете успешно настроить безопасный обмен данными между 1С и внешними системами.