При интеграции 1С с внешними веб-сервисами и сайтами программисты часто сталкиваются с ошибкой «Удаленный узел не прошел проверку». Эта ошибка возникает при попытке установить защищенное соединение (HTTPS) с ресурсом, SSL-сертификат которого не является доверенным для системы, в которой выполняется код 1С. Часто возникает желание решить эту проблему "одной строчкой кода", то есть чисто программно, но стандартные механизмы 1С не предоставляют такой возможности из соображений безопасности.
Давайте подробно разберем, почему возникает эта ошибка, какие есть ограничения у платформы и какие существуют правильные и обходные пути для решения этой задачи.
Первое, что нужно четко уяснить: ошибка «Удаленный узел не прошел проверку» возникает только при попытке установить HTTPS-соединение. Если вы получаете такую ошибку при использовании функций КопироватьФайл(), HTTPСоединение или других, это однозначно означает, что в адресе (URL), к которому вы обращаетесь, используется протокол https://.
Даже если вам кажется, что "обмен идет с сайтом без SSL", эта ошибка является прямым доказательством обратного. Скорее всего, сайт использует самоподписанный сертификат, сертификат с истекшим сроком действия или выданный на другое доменное имя. Система безопасности, на которой работает 1С, справедливо блокирует такое соединение как потенциально опасное.
Платформа «1С:Предприятие» спроектирована с учетом современных требований безопасности. Встроенные объекты, такие как HTTPСоединение, намеренно не имеют простого свойства вроде ИгнорироватьОшибкиSSL = Истина. Это сделано для того, чтобы разработчики не могли случайно или намеренно создать небезопасную интеграцию, которая будет уязвима для атак типа "человек посередине" (man-in-the-middle).
Проверка цепочки доверия сертификата — это фундаментальный принцип безопасности в интернете. Попытка обойти ее "в лоб" стандартными средствами не приведет к успеху, так как проверка происходит на более низком системном уровне.
Самый надежный и безопасный способ решить проблему — это не отключать проверку, а сделать так, чтобы она проходила успешно. Для этого нужно добавить сертификат удаленного сервера (или его корневой сертификат) в список доверенных на той машине, где исполняется код.
Важный момент: если ваш код выполняется на сервере 1С (например, в регламентном задании или фоновом задании), то все действия нужно производить на сервере 1С. Если код выполняется на клиенте — то на клиентской машине.
Разберем по шагам, как это сделать:
mmc и нажмите Enter.После этой процедуры операционная система будет доверять сертификату указанного сайта, и ошибка в 1С должна исчезнуть. Этот метод является предпочтительным, так как он не снижает общий уровень безопасности системы.
Если административный доступ к серверу невозможен или нужно временное решение для отладки, можно использовать внешние COM-объекты, которые предоставляют больше гибкости в управлении HTTP-запросами. Используйте эти методы с осторожностью, так как они отключают важные механизмы безопасности.
WinHttpRequest — это COM-объект Windows, который позволяет выполнять HTTP-запросы и управлять их параметрами, включая отключение проверки SSL.
Посмотрим на пример:
Предположим, нам нужно получить данные с адреса https://untrusted-site.com/api/data.
Функция ПолучитьДанныеСНенадежногоСайта(URL)
Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
Исключение
Сообщить("Не удалось создать объект WinHttp. Проверьте, что он зарегистрирован в системе.");
Возврат Неопределено;
КонецПопытки;
// Флаги для отключения проверки SSL.
// 13056 = 128 (SecureFailureIgnoreInvalidRoot) + 256 (SecureFailureIgnoreUnknownCA)
// + 512 (SecureFailureIgnoreWrongUsage) + 1024 (SecureFailureIgnoreCertRevFailed)
// + 4096 (SecureFailureIgnoreCertDateInvalid) + 8192 (SecureFailureIgnoreCertCNInvalid)
ФлагОтключенияПроверкиSSL = 13056;
// Устанавливаем опцию для игнорирования ошибок сертификата
// Option(4) это WinHttpRequestOption_SslErrorIgnoreFlags
WinHttp.Option(4, ФлагОтключенияПроверкиSSL);
// Выполняем GET-запрос
Попытка
WinHttp.Open("GET", URL, Ложь); // Ложь - синхронный запрос
WinHttp.Send();
Если WinHttp.Status = 200 Тогда
// Запрос успешен, возвращаем тело ответа
Возврат WinHttp.ResponseText;
Иначе
// Ошибка на сервере
Сообщить("Ошибка при запросе. Статус: " + WinHttp.Status + ". Текст: " + WinHttp.StatusText);
Возврат Неопределено;
КонецЕсли;
Исключение
Сообщить("Произошла ошибка при выполнении HTTP-запроса: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Этот код создаст COM-объект, установит специальную опцию Option(4) в значение, которое предписывает игнорировать все распространенные ошибки SSL-сертификатов, и выполнит запрос. Таким образом, вы программно обойдете проверку.
Проанализировав ситуацию, можно сделать несколько ключевых выводов:
HTTPСоединение, КопироватьФайл) не имеют встроенных средств для программного отключения этой проверки из соображений безопасности.WinHttp.WinHttpRequest.5.1, с установкой опции для игнорирования ошибок SSL. Этот способ следует применять с осторожностью и полным пониманием рисков безопасности.Выбирая между этими подходами, всегда отдавайте предпочтение первому, как наиболее безопасному и стабильному в долгосрочной перспективе.