Работа с внешними системами через защищенные протоколы HTTPS — стандартная задача для современного разработчика 1С. Однако при попытке подключиться к веб-сервису мы часто сталкиваемся с системной ошибкой: «Ошибка работы с Интернет: Удаленный узел не прошел проверку». Это происходит потому, что платформа «1С:Предприятие» не может подтвердить подлинность сертификата сервера, к которому обращается. Давайте подробно разберем, как устроена проверка безопасности, и проанализируем все способы решения этой задачи — от программного обхода до глубокой настройки цепочек сертификатов.
Когда 1С устанавливает соединение по протоколу HTTPS, происходит процесс, называемый SSL Handshake («рукопожатие»). Сервер присылает свой сертификат, а клиент (платформа 1С) должен проверить, подписан ли этот сертификат доверенным центром сертификации (CA). В платформу 1С встроен собственный список доверенных центров, который хранится в файле cacert.pem. Если сертификата вашего контрагента или его корневого центра в этом списке нет, 1С обрывает соединение из соображений безопасности. Проанализируем, как мы можем на это повлиять.
Самый быстрый и зачастую наиболее эффективный способ — правильно инициализировать объект ЗащищенноеСоединениеOpenSSL. В последних релизах платформы 8.3 этот объект позволяет гибко управлять проверкой. Если мы передаем в конструктор параметры Неопределено, система пытается использовать стандартные настройки. Рассмотрим пример кода для создания WSПрокси:
// Создаем объект защищенного соединения
// Параметры (СертификатКлиента, СертификатыУдостоверяющихЦентров)
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
// Используем его при создании определений или прокси
Попытка
Определения = Новый WSОпределения(URL_WSDL, Логин, Пароль, , , ЗащищенноеСоединение);
Прокси = Новый WSПрокси(Определения, URI_ПространстваИмен, ИмяСервиса, ИмяПорта, , , ЗащищенноеСоединение);
Исключение
Сообщить("Ошибка инициализации: " + ОписаниеОшибки());
КонецПопытки;
Обратите внимание на важный нюанс: если ваша база работает в клиент-серверном варианте, этот код должен выполняться на стороне сервера. Именно сервер 1С будет выполнять сетевой запрос, а значит, и настройки безопасности должны быть актуальны для сервера.
Если программный метод не помогает (например, при импорте WSDL непосредственно в конфигуратор), нам придется вручную добавить сертификат в список доверенных. Файл cacert.pem расположен в каталоге установленной платформы, обычно по пути: C:\Program Files\1cv8\номер_версии\bin\cacert.pem.
Рассмотрим по шагам, как правильно добавить сертификат:
-----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----.cacert.pem.Важный совет: При обновлении версии платформы 1С создается новая папка bin, и ваш модифицированный cacert.pem останется в старой папке. Не забудьте перенести изменения или настроить файл заново после обновления.
В некоторых случаях (например, при интеграции с государственными системами или банковскими шлюзами) сервер требует не только проверки своего сертификата, но и предъявления вашего личного сертификата. Обычно поставщик услуг выдает вам файл сертификата и закрытый ключ. Для 1С их лучше всего объединить в формат PKCS#12 (файл .p12).
Посмотрим, как подготовить такой файл с помощью утилиты OpenSSL:
openssl pkcs12 -export -in my_cert.crt -inkey private.key -out certificate_for_1c.p12
После этого в коде 1С мы указываем путь к этому файлу:
ПутьКФайлу = "C:\Certs\certificate_for_1c.p12";
Пароль = "ваш_пароль";
СертификатКлиента = Новый СертификатКлиентаФайл(ПутьКФайлу, Пароль);
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, Неопределено);
Если вы все сделали правильно, но ошибка «Удаленный узел не прошел проверку» сохраняется, проанализируем следующие моменты:
1C:Enterprise 8.3 Server Agent (обычно это USR1CV8), имеет права на чтение файлов сертификатов и папки bin.Начиная с современных версий 8.3.18+, мы можем попросить платформу обращаться напрямую к хранилищу сертификатов операционной системы. Это значительно упрощает жизнь системным администраторам, так как достаточно установить сертификат в Windows (в раздел «Доверенные корневые центры сертификации»), и 1С увидит его автоматически.
Для этого используем следующий объект:
УдостоверяющиеЦентры = Новый СертификатыУдостоверяющихЦентровWindows();
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, УдостоверяющиеЦентры);
Этот подход избавляет нас от необходимости редактировать текстовые файлы .pem и следить за их актуальностью при каждом обновлении платформы.
Подводя итог, можно сказать, что решение проблем с HTTPS в 1С требует понимания основ криптографии. Рекомендуем сначала попробовать программный способ с ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено), и только если это не помогает — переходить к импорту цепочек сертификатов в cacert.pem или системное хранилище ОС.