Как в 1С обойти ошибку "Удаленный узел не прошел проверку" при работе с SSL-сертификатом?

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

При интеграции 1С с внешними веб-сервисами и сайтами программисты часто сталкиваются с ошибкой «Удаленный узел не прошел проверку». Эта ошибка возникает при попытке установить защищенное соединение (HTTPS) с ресурсом, SSL-сертификат которого не является доверенным для системы, в которой выполняется код 1С. Часто возникает желание решить эту проблему "одной строчкой кода", то есть чисто программно, но стандартные механизмы 1С не предоставляют такой возможности из соображений безопасности.

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

Анализ проблемы: SSL есть, даже если кажется, что его нет

Первое, что нужно четко уяснить: ошибка «Удаленный узел не прошел проверку» возникает только при попытке установить HTTPS-соединение. Если вы получаете такую ошибку при использовании функций КопироватьФайл(), HTTPСоединение или других, это однозначно означает, что в адресе (URL), к которому вы обращаетесь, используется протокол https://.

Даже если вам кажется, что "обмен идет с сайтом без SSL", эта ошибка является прямым доказательством обратного. Скорее всего, сайт использует самоподписанный сертификат, сертификат с истекшим сроком действия или выданный на другое доменное имя. Система безопасности, на которой работает 1С, справедливо блокирует такое соединение как потенциально опасное.

Почему стандартные методы 1С не позволяют игнорировать проверку?

Платформа «1С:Предприятие» спроектирована с учетом современных требований безопасности. Встроенные объекты, такие как HTTPСоединение, намеренно не имеют простого свойства вроде ИгнорироватьОшибкиSSL = Истина. Это сделано для того, чтобы разработчики не могли случайно или намеренно создать небезопасную интеграцию, которая будет уязвима для атак типа "человек посередине" (man-in-the-middle).

Проверка цепочки доверия сертификата — это фундаментальный принцип безопасности в интернете. Попытка обойти ее "в лоб" стандартными средствами не приведет к успеху, так как проверка происходит на более низком системном уровне.

Решение 1: Административный подход (рекомендуемый и правильный)

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

Важный момент: если ваш код выполняется на сервере 1С (например, в регламентном задании или фоновом задании), то все действия нужно производить на сервере 1С. Если код выполняется на клиенте — то на клиентской машине.

Разберем по шагам, как это сделать:

  1. Получение сертификата. Самый простой способ — открыть проблемный URL в браузере (например, Google Chrome или Firefox). Браузер покажет предупреждение о небезопасном соединении. Нажмите на значок замка в адресной строке, перейдите в сведения о сертификате и экспортируйте его в файл (обычно в формате .CER или .CRT). Если у сервера есть цепочка сертификатов, лучше экспортировать всю цепочку, начиная с корневого.
  2. Установка сертификата в хранилище.
    • Нажмите Win+R, введите mmc и нажмите Enter.
    • В открывшейся консоли выберите "Файл" -> "Добавить или удалить оснастку".
    • Выберите "Сертификаты" и нажмите "Добавить".
    • В следующем окне выберите "учетной записи компьютера". Это важно, чтобы сертификат был доступен для системных служб, какой и является служба сервера 1С. Нажмите "Далее" и "Готово".
    • В дереве слева разверните "Сертификаты (локальный компьютер)" -> "Доверенные корневые центры сертификации" -> "Сертификаты".
    • Нажмите правой кнопкой мыши на папке "Сертификаты", выберите "Все задачи" -> "Импорт".
    • Запустится мастер импорта. Укажите путь к файлу сертификата, который вы сохранили на первом шаге, и завершите установку, поместив сертификат в хранилище "Доверенные корневые центры сертификации".

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

Решение 2: Программный обход с помощью внешних объектов

Если административный доступ к серверу невозможен или нужно временное решение для отладки, можно использовать внешние COM-объекты, которые предоставляют больше гибкости в управлении HTTP-запросами. Используйте эти методы с осторожностью, так как они отключают важные механизмы безопасности.

Использование WinHttpRequest

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-сертификатов, и выполнит запрос. Таким образом, вы программно обойдете проверку.

Выводы

Проанализировав ситуацию, можно сделать несколько ключевых выводов:

  1. Ошибка "Удаленный узел не прошел проверку" всегда связана с проблемами доверия к SSL-сертификату при HTTPS-соединении.
  2. Стандартные объекты 1С (HTTPСоединение, КопироватьФайл) не имеют встроенных средств для программного отключения этой проверки из соображений безопасности.
  3. Правильный и рекомендуемый способ — административный: добавить проблемный сертификат в доверенные корневые центры сертификации на машине, где выполняется код (сервер 1С или клиент).
  4. Обходной программный путь существует через использование внешних COM-объектов, например, WinHttp.WinHttpRequest.5.1, с установкой опции для игнорирования ошибок SSL. Этот способ следует применять с осторожностью и полным пониманием рисков безопасности.

Выбирая между этими подходами, всегда отдавайте предпочтение первому, как наиболее безопасному и стабильному в долгосрочной перспективе.

← На главную