Каждый разработчик 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С, хотя в обычном браузере сайт открывается без проблем:
ar.site.ru, а запрос отправляется на site.ru (или наоборот). Браузеры могут выводить предупреждение или автоматически обрабатывать перенаправление, но 1С в данном случае жестко блокирует соединение.cacert.pem. Если сайт использует новый или специфический удостоверяющий центр (например, бесплатные сертификаты Let's Encrypt или новые отечественные сертификаты Минцифры), цепочка доверия не может быть построена.USR1CV8). У этого пользователя операционной системы может не быть доступа к системному хранилищу сертификатов Windows или отсутствовать доступ в интернет через прокси-сервер.Функция КопироватьФайл спроектирована как максимально простой инструмент. У нее всего два обязательных параметра (имя файла-источника и имя файла-приемника) и нет никаких дополнительных настроек для управления SSL-соединением. Мы не можем передать туда параметры, отключающие проверку подлинности хоста или игнорирующие ошибки сертификации (аналог флага --no-check-certificate в утилите wget).
Поэтому, если удаленный сервер имеет проблемы с SSL-сертификатом или платформа 1С не может его проверить, использовать КопироватьФайл напрямую становится невозможно. Нам необходимо прибегнуть к более гибким инструментам платформы.
Если перед нами стоит задача просто скачать картинку или файл, и нам не требуется строгая проверка безопасности (например, мы доверяем источнику), мы можем полностью отключить проверку 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С.
Бывают ситуации, когда вносить изменения в программный код конфигурации крайне нежелательно (например, конфигурация находится на поддержке, или метод КопироватьФайл жестко зашит в закрытом программном модуле). В таком случае проблему приходится решать административными методами.
Как мы уже выяснили, старые версии платформы 1С сверяют SSL-сертификаты с собственным локальным списком доверенных центров, хранящимся в файле cacert.pem. Если сайт перешел на современные сертификаты (например, Let's Encrypt), 1С просто «не знает» этого удостоверяющего центра.
Давайте разберем по шагам, как обновить этот файл:
C:\Program Files\1cv8\[ВерсияПлатформы]\bin\cacert.pem (или в папке bin на сервере, если код выполняется в серверном контексте).cacert.pem, который регулярно обновляется сообществом разработчиков утилиты cURL.cacert.pem в папке bin платформы в cacert.pem.bak (для возможности отката).cacert.pem в папку bin.Важное предупреждение: При каждом обновлении платформы 1С создается новая папка с номером версии (например, 8.3.22.1709), в которой будет находиться стандартный, устаревший файл cacert.pem. Это означает, что процедуру обновления файла сертификатов придется повторять после каждого обновления платформы.
В современных версиях платформы (начиная с 8.3.8) 1С умеет использовать системное хранилище сертификатов операционной системы Windows. Если вы сталкиваетесь с ошибкой на сервере, это может означать, что у системной учетной записи, под которой крутится служба сервера 1С, отсутствуют нужные корневые сертификаты.
Проанализируем шаги для решения этой проблемы:
services.msc). Обычно это локальный системный пользователь USR1CV8 или доменная техническая учетная запись..CER (или .DER).USR1CV8, запустить консоль сертификатов от её имени можно с помощью утилиты psexec из пакета Sysinternals:
psexec -i -u USR1CV8 mmc certmgr.mscМы детально изучили проблему проверки SSL-сертификатов при работе с внешними интернет-источниками в 1С. В качестве подведения итогов дадим краткие рекомендации, какой метод решения выбрать в зависимости от ситуации:
cacert.pem или настраивайте системные сертификаты Windows для учетной записи службы 1С.