Как исправить ошибку «SSL connect error» при обмене 1С 8.2 с сайтом по HTTPS?

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

Рассмотрим распространенную и крайне неприятную проблему, с которой часто сталкиваются разработчики и системные администраторы при поддержке систем на платформе 1С:Предприятие 8.2. При попытке выполнить обмен данными с сайтом (например, выгрузку товаров или загрузку заказов) через защищенное соединение HTTPS внезапно возникает критическая ошибка:

{ОбщийМодуль.CMS1C_ПроцедурыОбменаССайтомСервер.Модуль}: Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: SSL connect error

Особенно часто эта проблема проявляется после переноса сайта на другой хостинг, смены SSL-сертификата (например, на бесплатный от Let's Encrypt) или обновления настроек безопасности на стороне веб-сервера. При этом через обычный браузер (Google Chrome, Яндекс.Браузер) сайт открывается абсолютно корректно и без предупреждений системы безопасности. Давайте подробно разберем, почему так происходит, как правильно диагностировать эту проблему и какие существуют практические способы ее решения без необходимости обновления платформы 1С.

Выясняем глубинную причину ошибки

Чтобы понять, почему возникает ошибка SSL connect error, нам необходимо проанализировать механизм работы платформы 1С 8.2 с защищенными соединениями. В отличие от современных интернет-браузеров, которые имеют встроенные развитые механизмы обхода некоторых ошибок конфигурации SSL и используют актуальные системные хранилища сертификатов, старая платформа 1С 8.2 опирается на собственные, давно не обновлявшиеся библиотеки (в частности, устаревшие версии libcurl и OpenSSL).

Когда 1С пытается установить HTTPS-соединение, происходят следующие процессы:

  1. Платформа инициирует SSL-рукопожатие (SSL Handshake) с веб-сервером.
  2. Веб-сервер отправляет свой публичный сертификат безопасности.
  3. 1С пытается проверить всю цепочку доверия (от конечного сертификата сайта через промежуточные сертификаты до корневого доверенного центра сертификации).
  4. Если цепочка доверия не может быть построена или проверена, либо если сервер требует поддержки современных протоколов шифрования (например, TLS 1.2 или TLS 1.3), которые не поддерживаются устаревшим клиентом 1С, соединение аварийно разрывается с ошибкой SSL connect error.

В контексте использования сертификатов Let's Encrypt критическую роль играет также то, что в сентябре 2021 года истек срок действия старого корневого сертификата DST Root CA X3. Современные сайты перешли на новый корневой сертификат ISRG Root X1. Старые операционные системы и платформы (включая 1С 8.2) «из коробки» не имеют сведений об этом новом корневом сертификате, из-за чего проверка цепочки доверия полностью проваливается.

Кроме того, на новых хостингах по умолчанию часто отключены устаревшие протоколы TLS 1.0 и TLS 1.1. Если веб-сервер принимает запросы строго по протоколам TLS 1.2 и TLS 1.3, а старая платформа 1С пытается стучаться по старым протоколам, то защищенное соединение установить не удастся.

Шаг 1. Диагностика цепочки сертификатов с помощью утилиты OpenSSL

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

openssl s_client -connect вашсайт.ru:443 -servername вашсайт.ru

Внимательно изучим полученный ответ системы. Если в процессе валидации цепочки сертификатов возникает ошибка, мы увидим примерно следующий вывод:


CONNECTED(0000017C)
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = vitateka.ee
verify return:1
---
Certificate chain
 0 s:CN = vitateka.ee
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
 1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
   i:O = Digital Signature Trust Co., CN = DST Root CA X3

Обратим особое внимание на строку: verify error:num=20:unable to get local issuer certificate. Это прямое указание на то, что проверяющая утилита (и, соответственно, наша платформа 1С) не может получить локальный сертификат эмитента, то есть цепочка доверия повреждена. Браузеры умеют самостоятельно подтягивать недостающие промежуточные сертификаты из интернета, а вот встроенные механизмы 1С этого делать не умеют. Им требуется идеально настроенная конфигурация на стороне веб-сервера.

Решение 1. Правильная настройка веб-сервера (Apache / Nginx)

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

Рассмотрим, как исправить настройки для популярного веб-сервера Apache. Очень часто системные администраторы совершают ошибку и указывают параметры следующим образом (неправильный вариант):


SSLCertificateFile "/etc/letsencrypt/live/vitateka.ee/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/vitateka.ee/privkey.pem"

При такой настройке Apache отдает клиенту усеченную цепочку. Чтобы исправить ситуацию, мы должны явно прописать все файлы сертификатов, включая цепочку доверия. Изменим конфигурационный файл виртуального хоста Apache следующим образом (правильный вариант):


SSLCertificateFile /etc/letsencrypt/live/vitateka.ee/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/vitateka.ee/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vitateka.ee/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/vitateka.ee/chain.pem

Если на вашем сервере используется веб-сервер Nginx, убедитесь, что в директиве ssl_certificate указан путь именно к файлу fullchain.pem, который содержит в себе и сам сертификат вашего домена, и все промежуточные сертификаты Let's Encrypt, расположенные в правильном иерархическом порядке:


ssl_certificate /etc/letsencrypt/live/vitateka.ee/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vitateka.ee/privkey.pem;

После внесения изменений обязательно перезапустите ваш веб-сервер (например, выполнив команду service apache2 restart или systemctl restart nginx) и заново запустите проверку через openssl. Ошибка unable to get local issuer certificate должна исчезнуть.

Решение 2. Обновление локального файла cacert.pem в 1С с учетом кэширования

Если у нас нет доступа к настройкам веб-сервера сайта (например, сайт принадлежит стороннему контрагенту), мы можем заставить платформу 1С доверять новому сертификату. Для этого необходимо обновить файл корневых сертификатов cacert.pem, который поставляется вместе с платформой 1С.

Разберем этот процесс по шагам, так как простое скачивание файла часто не помогает из-за неочевидных нюансов работы платформы:

  1. Выясним, где именно выполняется код обмена. Если обмен запускается в фоновом задании или код общего модуля выполняется на сервере (на что указывает директива &НаСервере или имя модуля CMS1C_ПроцедурыОбменаССайтомСервер), то обновлять файл необходимо на сервере приложений 1С:Предприятие, а не на локальном компьютере пользователя!
  2. Перейдем в каталог установленной платформы на сервере 1С. Обычно он располагается по пути:
    C:\Program Files\1cv82\8.2.XX.YYY\bin\ (или C:\Program Files (x86)\1cv82\8.2.XX.YYY\bin\ для 32-битной версии).
  3. Найдем в этой папке файл cacert.pem. Это обычный текстовый файл, содержащий базу доверенных корневых сертификатов в формате PEM.
  4. Скачаем актуальный набор корневых сертификатов с официального сайта curl (файл cacert.pem) или вручную скопируем текстовое содержимое нового корневого сертификата ISRG Root X1 с сайта Let's Encrypt и вставим его в самый конец нашего файла cacert.pem.
  5. Важнейший нюанс: Платформа 1С считывает данные из файла cacert.pem ровно один раз при инициализации первого интернет-соединения рабочим процессом сервера 1С (rphost.exe) и затем кэширует их в оперативной памяти. Любые изменения в файле не вступят в силу, пока вы не выполните полную перезагрузку службы сервера «1С:Предприятие»! Перезапустите службу через оснастку services.msc.

Решение 3. Активация протокола TLS 1.2 на уровне операционной системы Windows

Если веб-сервер сайта настроен корректно, цепочка сертификатов полная, но 1С все равно выдает ошибку, проблема может заключаться в несовместимости версий протокола TLS. Платформа 1С 8.2 при работе под управлением старых операционных систем Windows (например, Windows Server 2008 R2 или Windows 7) по умолчанию использует системные настройки библиотеки WinHTTP, в которой протокол TLS 1.2 может быть отключен.

Проанализируем ситуацию и включим поддержку TLS 1.2 через системный реестр Windows:

  1. Откроем редактор реестра (нажмите сочетание клавиш Win + R, введите regedit и нажмите Enter).
  2. Перейдем к разделу конфигурации WinHTTP для 32-битных приложений:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp
  3. Создадим в этом разделе параметр типа DWORD (32-бит) с именем DefaultSecureProtocols.
  4. Присвоим созданному параметру значение 0x00000800 в шестнадцатеричной системе исчисления (что соответствует включению протокола TLS 1.2 по умолчанию).
  5. Если сервер 1С работает под управлением 64-битной операционной системы, нам необходимо обязательно продублировать эту настройку в ветке для 64-битных приложений:
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp
    Также создадим там параметр DefaultSecureProtocols со значением 0x00000800.
  6. Для старых операционных систем (Windows Server 2008 R2 и Windows 7) перед редактированием реестра обязательно нужно установить официальное обновление от Microsoft под номером KB3140245, которое добавляет поддержку TLS 1.2 в системный сетевой стек.

Решение 4. Использование COM-объекта WinHttpRequest для обхода ограничений платформы

Если нам запрещено вносить глобальные изменения в настройки операционной системы или менять файлы в каталоге платформы 1С, мы можем решить проблему локально, изменив код интеграции в самой конфигурации. Вместо стандартного объекта 1С HTTPСоединение, мы можем задействовать системный COM-объект Windows WinHttp.WinHttpRequest.5.1.

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

Посмотрим на пример кода, который заменяет стандартный вызов метода отправки запроса в 1С:


// Создаем экземпляр системного COM-объекта
HTTPЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");

// Инициализируем POST-запрос к нашему скрипту обмена
URL_Адрес_Сайта = "https://vitateka.ee/1c.php";
HTTPЗапрос.Open("POST", URL_Адрес_Сайта, Ложь);

// Устанавливаем необходимые заголовки запроса
HTTPЗапрос.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");

// Настройка флагов безопасности (опция 4 - WinHttpRequestOption_SslErrorIgnoreFlags)
// Значение 13056 (0x3300) указывает объекту игнорировать абсолютно любые ошибки SSL-сертификатов
// (истекший срок действия, несовпадение имени узла, недоверенный центр сертификации)
HTTPЗапрос.Option(4, 13056);

// Формируем тело запроса с параметрами обмена
ДанныеЗапроса = "mode=query&type=catalog";

Попытка
    // Отправляем запрос на веб-сервер
    HTTPЗапрос.Send(ДанныеЗапроса);
    
    // Получаем ответ в виде строки
    СтрокаОтвета = HTTPЗапрос.ResponseText;
    Сообщить("Обмен успешно выполнен. Ответ сервера: " + СтрокаОтвета);
Исключение
    Сообщить("Ошибка при отправке запроса через COM: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;

Этот способ гарантирует 100% работоспособность обмена независимо от версии платформы 1С 8.2, поскольку процесс шифрования полностью делегируется операционной системе Windows.

Решение 5. Использование локального SSL-туннеля (stunnel)

Еще один профессиональный способ обхода ограничений старой платформы 1С — использование стороннего прокси-клиента для шифрования трафика. Самым популярным и надежным решением является бесплатная утилита stunnel.

Идея метода заключается в следующем:


// Подключаемся к локальному прокси-туннелю по обычному протоколу HTTP
Соединение = Новый HTTPСоединение("localhost", 8080);
// Отправляем запрос, который будет автоматически зашифрован утилитой stunnel
Ответ = Соединение.Получить(Новый HTTPЗапрос("/1c.php"));

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

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

Мы подробно разобрали пять различных способов решения проблемы с подключением 1С 8.2 к сайту по протоколу HTTPS. Выбор конкретного метода зависит от вашей инфраструктуры:

← На главную