Как исправить ошибку «Удаленный узел не прошел проверку» при копировании файлов по HTTPS в 1С

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

Каждый разработчик 1С рано или поздно сталкивается с задачей интеграции с внешними системами. Это может быть загрузка картинок товаров с сайта поставщика, получение прайс-листов или обмен данными через API. Зачастую для скачивания файлов используется простая и интуитивно понятная функция КопироватьФайл. Однако при переходе веб-ресурсов на защищенное соединение HTTPS эта функция может преподнести неприятный сюрприз в виде критической ошибки: «Ошибка работы с Интернет: Удаленный узел не прошел проверку».

В этой статье мы подробно разберем, почему возникает эта проблема, как устроены механизмы проверки SSL-сертификатов в платформе «1С:Предприятие», и рассмотрим несколько надежных способов обхода и устранения этой ошибки как программными, так и административными методами.

Выясняем причину: почему ломается КопироватьФайл?

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

КопироватьФайл("https://www.site.ru/pict/image.jpg", "D:\temp\image.jpg");

При выполнении этой строки платформа 1С инициирует HTTPS-соединение с удаленным сервером. В отличие от обычного HTTP, протокол HTTPS требует обязательного установления защищенного SSL/TLS-соединения. В процессе «рукопожатия» (handshake) удаленный сервер отправляет свой SSL-сертификат, подтверждающий его подлинность.

И именно в этот момент платформа 1С выполняет строгую валидацию полученного сертификата. Если проверка завершается неудачей, 1С прерывает соединение из соображений безопасности. Ошибка «Удаленный узел не прошел проверку» означает, что платформа не смогла подтвердить доверие к сертификату веб-сайта.

Основные причины, почему сертификат не проходит проверку в 1С, хотя в обычном браузере сайт открывается без проблем:

  1. Несоответствие доменного имени: Сертификат выпущен для домена ar.site.ru, а запрос отправляется на site.ru (или наоборот). Браузеры могут выводить предупреждение или автоматически обрабатывать перенаправление, но 1С в данном случае жестко блокирует соединение.
  2. Отсутствие корневого сертификата в локальном хранилище 1С: Платформа 1С (особенно старых версий) использует собственный файл доверенных сертификатов cacert.pem. Если сайт использует новый или специфический удостоверяющий центр (например, бесплатные сертификаты Let's Encrypt или новые отечественные сертификаты Минцифры), цепочка доверия не может быть построена.
  3. Усиленная политика проверки в новых версиях платформы: Начиная с версий 8.3.10 и выше, механизмы безопасности 1С были значительно ужесточены. Теперь платформа проверяет не только саму цепочку сертификатов, но и запрашивает статус отзыва сертификата через протоколы CRL и OCSP. Если сервер 1С изолирован от интернета или запросы к серверам проверки списков отзыва блокируются брандмауэром, соединение будет разорвано.
  4. Контекст выполнения (Клиент-Сервер): Если код выполняется на сервере 1С, запрос отправляется из-под учетной записи службы (обычно это USR1CV8). У этого пользователя операционной системы может не быть доступа к системному хранилищу сертификатов Windows или отсутствовать доступ в интернет через прокси-сервер.

Главное ограничение метода КопироватьФайл

Функция КопироватьФайл спроектирована как максимально простой инструмент. У нее всего два обязательных параметра (имя файла-источника и имя файла-приемника) и нет никаких дополнительных настроек для управления SSL-соединением. Мы не можем передать туда параметры, отключающие проверку подлинности хоста или игнорирующие ошибки сертификации (аналог флага --no-check-certificate в утилите wget).

Поэтому, если удаленный сервер имеет проблемы с SSL-сертификатом или платформа 1С не может его проверить, использовать КопироватьФайл напрямую становится невозможно. Нам необходимо прибегнуть к более гибким инструментам платформы.

Решение №1: Программный обход через HTTPСоединение (рекомендуемый способ)

Если перед нами стоит задача просто скачать картинку или файл, и нам не требуется строгая проверка безопасности (например, мы доверяем источнику), мы можем полностью отключить проверку SSL-сертификатов на стороне 1С. Для этого мы заменим метод КопироватьФайл на использование связки объектов HTTPСоединение и ЗащищенноеСоединениеOpenSSL.

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

Посмотрим на пример кода:


// Шаг 1. Создаем объект защищенного соединения.
// Оставляя параметры конструктора пустыми, мы отключаем проверку сертификата сервера.
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

// Шаг 2. Выделяем хост (доменное имя) из общей ссылки.
// Метод HTTPСоединение требует указания только имени сервера, без протокола https://
АдресСервера = "www.art-region.ru"; 
ПутьКФайлуНаСервере = "/pict/0694596f.jpg";
ЛокальныйПутьДляСохранения = "D:\temp\111.jpg";

Попытка
    // Шаг 3. Инициализируем HTTP-соединение с использованием созданного защищенного соединения
    Соединение = Новый HTTPСоединение(
        АдресСервера, // Сервер (хост)
        ,,,,          // Порт, Пользователь, Пароль, Прокси (пропускаем, если не требуются)
        60,           // Таймаут соединения в секундах
        ЗащищенноеСоединение // Наше защищенное соединение без проверок
    );

    // Шаг 4. Отправляем GET-запрос и сохраняем результат непосредственно в файл
    Соединение.Получить(ПутьКФайлуНаСервере, ЛокальныйПутьДляСохранения);
    
    Сообщить("Файл успешно скопирован и сохранен по пути: " + ЛокальныйПутьДляСохранения);
Исключение
    // Обрабатываем возможные ошибки сети или доступа к локальному диску
    ЗаписьЖурналаРегистрации("СкачиваниеФайла", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    ВызватьИсключение "Не удалось загрузить файл по причине: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;

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

Решение №2: Административное обновление файла сертификатов cacert.pem

Бывают ситуации, когда вносить изменения в программный код конфигурации крайне нежелательно (например, конфигурация находится на поддержке, или метод КопироватьФайл жестко зашит в закрытом программном модуле). В таком случае проблему приходится решать административными методами.

Как мы уже выяснили, старые версии платформы 1С сверяют SSL-сертификаты с собственным локальным списком доверенных центров, хранящимся в файле cacert.pem. Если сайт перешел на современные сертификаты (например, Let's Encrypt), 1С просто «не знает» этого удостоверяющего центра.

Давайте разберем по шагам, как обновить этот файл:

  1. Выясним, где установлен шаблон сертификатов для вашей версии платформы. Обычно он располагается по пути:
    C:\Program Files\1cv8\[ВерсияПлатформы]\bin\cacert.pem (или в папке bin на сервере, если код выполняется в серверном контексте).
  2. Нам необходимо получить актуальный список доверенных корневых сертификатов. Самый простой и надежный способ — скачать актуальный файл cacert.pem, который регулярно обновляется сообществом разработчиков утилиты cURL.
  3. Переименуйте старый файл cacert.pem в папке bin платформы в cacert.pem.bak (для возможности отката).
  4. Скопируйте новый скачанный файл cacert.pem в папку bin.
  5. Если вы используете клиент-серверный вариант работы 1С, обязательно перезапустите службу сервера «1С:Предприятие», чтобы изменения вступили в силу.

Важное предупреждение: При каждом обновлении платформы 1С создается новая папка с номером версии (например, 8.3.22.1709), в которой будет находиться стандартный, устаревший файл cacert.pem. Это означает, что процедуру обновления файла сертификатов придется повторять после каждого обновления платформы.

Решение №3: Импорт сертификата в системное хранилище Windows

В современных версиях платформы (начиная с 8.3.8) 1С умеет использовать системное хранилище сертификатов операционной системы Windows. Если вы сталкиваетесь с ошибкой на сервере, это может означать, что у системной учетной записи, под которой крутится служба сервера 1С, отсутствуют нужные корневые сертификаты.

Проанализируем шаги для решения этой проблемы:

  1. Определите, под каким пользователем запущена служба «Агент сервера 1С:Предприятия» (через оснастку services.msc). Обычно это локальный системный пользователь USR1CV8 или доменная техническая учетная запись.
  2. Экспортируйте SSL-сертификат проблемного сайта через любой браузер. Для этого зайдите на сайт, нажмите на значок замочка в адресной строке, откройте сведения о сертификате и сохраните его на диск в формате .CER (или .DER).
  3. Зайдите на сервер под учетной записью, от имени которой работает служба 1С. Если это системная служба USR1CV8, запустить консоль сертификатов от её имени можно с помощью утилиты psexec из пакета Sysinternals:
    psexec -i -u USR1CV8 mmc certmgr.msc
  4. Импортируйте сохраненный сертификат сайта в раздел «Доверенные корневые центры сертификации» (Trusted Root Certification Authorities) для этого пользователя.
  5. Перезапустите службу сервера 1С.

Резюме и рекомендации

Мы детально изучили проблему проверки SSL-сертификатов при работе с внешними интернет-источниками в 1С. В качестве подведения итогов дадим краткие рекомендации, какой метод решения выбрать в зависимости от ситуации:

← На главную