При интеграции 1С со сторонними веб-сервисами (API мессенджеров, интернет-магазины, государственные порталы) мы часто сталкиваемся с необходимостью работы через защищенный протокол HTTPS. Казалось бы, задача тривиальная, однако нередко возникает ситуация: в браузере на сервере ссылка открывается, сертификат выглядит валидным (зеленый замочек), а при попытке программного подключения из 1С возникает ошибка «Удаленный узел не прошел проверку».
В этой статье мы подробно разберем, почему возникает эта ошибка, рассмотрим быстрый (но небезопасный) способ её устранения, а также проанализируем правильный метод настройки защищенного соединения, исключающий уязвимости.
Рассмотрим типичный сценарий. Мы пытаемся подключиться к внешнему ресурсу, используя объект HTTPСоединение. Для работы по HTTPS нам необходимо передать параметры защищенного соединения. Часто разработчики используют стандартный код, полагаясь на системные хранилища сертификатов Windows:
SSL = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(),
Новый СертификатыУдостоверяющихЦентровWindows()
);
HTTPСоединение = Новый HTTPСоединение(
АдресСервера,
, , , , 20, SSL
);
И именно в этот момент платформа выдает исключение о том, что проверка узла не пройдена. При этом системный администратор утверждает, что сертификаты установлены, и демонстрирует успешное открытие адреса в Chrome или Edge на том же сервере.
Давайте разберемся, как это исправить.
Если нам нужно срочно запустить интеграцию или мы находимся в контуре разработки, где безопасность канала не является критическим фактором, мы можем отключить проверку валидности SSL-сертификата со стороны 1С.
Для этого изменим инициализацию объекта ЗащищенноеСоединениеOpenSSL. Если в конструктор не передавать параметры, платформа по умолчанию не будет сверять сертификат сервера с доверенными центрами сертификации.
Рассмотрим измененный код:
// Создаем защищенное соединение БЕЗ проверки сертификатов
SSL = Новый ЗащищенноеСоединениеOpenSSL();
HTTPСоединение = Новый HTTPСоединение(
НастройкиСервиса["Сервер"] + НастройкиСервиса["Сервис"],
, , , , 20, SSL
);
Почему это работает?
В этом случае 1С устанавливает шифрованный канал связи, но не проверяет, действительно ли сервер на том конце является тем, за кого себя выдает. Ошибка проверки узла исчезает, так как сама проверка не выполняется.
В чем опасность?
Используя этот метод в рабочей среде (Production), мы подвергаем систему риску атаки "Человек посередине" (MitM — Man in the Middle). Злоумышленник может перехватить трафик, подставив свой сертификат, и 1С "молча" согласится передать данные. Поэтому данный метод рекомендуется использовать только для отладки или внутри защищенного периметра сети.
Если мы хотим оставить проверку валидности (что настоятельно рекомендуется), нам нужно понять, почему код из первого примера не работал. Основных причин две:
USR1CV8). Сертификаты, установленные в хранилище "Личное" или "Текущий пользователь", недоступны службе сервера 1С.Чтобы метод Новый СертификатыУдостоверяющихЦентровWindows() отработал корректно, выполним следующие шаги:
Шаг 1. Экспорт сертификата
Откроем сайт сервиса в браузере, нажмем на замочек в адресной строке и экспортируем сертификат в файл (обычно формат .cer или .crt). Желательно выгрузить всю цепочку сертификации (путь сертификации).
Шаг 2. Установка в правильное хранилище
Устанавливать сертификат нужно не просто двойным кликом (который часто ставит его в профиль текущего пользователя), а через консоль управления сертификатами (mmc).
После этих действий код с использованием СертификатыУдостоверяющихЦентровWindows() должен начать работать, так как служба сервера 1С увидит доверенный сертификат в общем хранилище машины.
Существует еще один, наиболее надежный и кроссплатформенный способ (особенно актуально для серверов на Linux, где нет хранилища Windows). Платформа 1С использует собственное хранилище сертификатов, расположенное в файле cacert.pem.
Давайте разберем алгоритм действий:
cacert.pem в каталоге установки платформы 1С (папка bin).-----BEGIN CERTIFICATE----- и заканчивающийся -----END CERTIFICATE-----.cacert.pem и вставим скопированный блок в самый конец файла.После этой процедуры платформе даже не обязательно указывать параметры сертификации — она автоматически подхватит обновленный список доверенных узлов из своего конфигурационного файла. Либо можно явно указать путь к файлу сертификата при создании соединения:
// Если мы сохранили нужный сертификат в отдельный файл
ПутьКСертификату = "C:\Certs\vk_teams.pem";
SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентровФайл(ПутьКСертификату));
Мы выяснили, что ошибка проверки узла возникает из-за отсутствия доверия между клиентом 1С и сервером. Для быстрой отладки можно использовать конструктор ЗащищенноеСоединениеOpenSSL без параметров, но для продуктивной среды обязательно обеспечьте наличие сертификатов в хранилище локального компьютера или в файле cacert.pem. Это гарантирует безопасность передаваемых данных и защитит вашу систему от перехвата информации.