При интеграции 1С с внешними или внутренними веб-сервисами разработчики часто сталкиваются с ошибкой: «Ошибка работы с Интернет: Ошибка инициализации SSL-соединения». При этом сторонние утилиты (например, Advanced REST Client, Postman или обычный браузер) могут успешно выполнять запросы к этому же адресу.
В этой статье мы подробно разберем, почему возникает данная ошибка при работе с защищенными соединениями в 1С, проанализируем внутренние механизмы платформы и предложим несколько эффективных способов решения проблемы.
Рассмотрим типовой пример кода, который часто приводит к возникновению ошибки инициализации соединения:
Функция ВыполнитьPOSTЗапрос(ИмяСервера, Порт, СтрокаОтправки, СсылкаНаРесурс) Экспорт
// Инициализация защищенного соединения с использованием системных сертификатов Windows
ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());
HTTP = Новый HTTPСоединение(ИмяСервера, Порт, , , , 60, ssl);
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить("Content-Length", СтрДлина(СтрокаОтправки));
ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
Запрос = Новый HTTPЗапрос(СсылкаНаРесурс, ЗаголовокЗапросаHTTP);
Запрос.УстановитьТелоИзСтроки(СтрокаОтправки);
Возврат HTTP.ОтправитьДляОбработки(Запрос);
КонецФункции
При вызове этой функции с параметрами ВыполнитьPOSTЗапрос("192.168.20.12", 7000, ТекстXML, "/cwms/ws/NOM") платформа возвращает ошибку инициализации SSL. Выясним основные причины такого поведения.
---
Это наиболее частая причина сбоя при работе в локальных сетях (интранете). SSL/TLS-сертификаты практически никогда не выписываются на IP-адрес — они привязываются к конкретному доменному имени (например, cwms.company.local).
Компонент OpenSSL, встроенный в платформу 1С, выполняет строгую валидацию соответствия узла. Если в коде указан IP-адрес 192.168.20.12, а в сертификате сервера прописано доменное имя, библиотека шифрования прервет процесс рукопожатия (Handshake) из-за несоответствия имен (Hostname Mismatch).
Почему работают REST-клиенты: Специализированные программы по умолчанию игнорируют ошибки валидации имен хостов и самоподписанных сертификатов. 1С требует явного доверия к узлу.
Решение:
hosts на компьютере (или сервере), где выполняется код 1С:
192.168.20.12 cwms.company.local
---
Проанализируем, под кем выполняется код. Если вызов происходит на стороне сервера (например, в регламентном задании или серверном модуле), то инициатором запроса выступает системная учетная запись, под которой запущена служба «1С:Предприятия» (обычно это USR1CV8).
Даже если вы установили все необходимые сертификаты в хранилище «Текущий пользователь» под своей учетной записью администратора Windows, служба сервера 1С ничего о них не знает.
Решение:
---
В зависимости от версии платформы 1С и режима совместимости конфигурации, поведение системы при проверке сертификатов различается:
cacert.pem, расположенному по пути C:\Program Files\1cv8\8.3.X.XXXX\bin\cacert.pem.Решение для современных платформ: Измените инициализацию защищенного соединения, явно указав использование удостоверяющих центров операционной системы:
ssl = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентровОС());
Использование Неопределено в первом параметре отключает отправку клиентского сертификата (если сервер его не требует принудительно), что решает проблемы, когда сервер ошибочно отвергает пустой контейнер клиентских сертификатов Windows.
Решение для старых платформ (или при строгих политиках совместимости):
---BEGIN CERTIFICATE--- и ---END CERTIFICATE---).cacert.pem в папке bin текущей платформы 1С на сервере.---
Современные веб-серверы из соображений безопасности отключают поддержку устаревших протоколов SSL 3.0, TLS 1.0 и TLS 1.1, оставляя активными только TLS 1.2 и TLS 1.3.
Если сервер настроен на жесткие правила шифрования (Cipher Suites), а платформа 1С или операционная система, на которой она установлена, устарели, они не смогут договориться о поддерживаемых методах шифрования во время рукопожатия.
Решение:
---
Если у вас нет возможности изменять настройки сертификатов на сервере 1С, редактировать файлы платформы или обновлять конфигурацию, можно использовать альтернативный вариант отправки запросов через COM-объект Windows.
Объект WinHttp.WinHttpRequest.5.1 позволяет гибко управлять параметрами безопасности и принудительно игнорировать любые ошибки SSL-сертификатов (включая самоподписанные сертификаты и несоответствие имени хоста).
Рассмотрим пример реализации функции отправки POST-запроса через этот механизм:
Функция ВыполнитьPOSTЗапросЧерезWinHttp(ИмяСервера, Порт, СтрокаОтправки, СсылкаНаРесурс) Экспорт
Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Формируем полный URL-адрес
АдресРесурса = "https://" + ИмяСервера + ":" + Формат(Порт, "ЧГ=0") + СсылкаНаРесурс;
WinHttp.Open("POST", АдресРесурса, Ложь);
// Опция 4 отвечает за обработку ошибок сертификатов.
// Значение 13056 (0x3300) предписывает игнорировать:
// - Несоответствие имени хоста (Unknown CN)
// - Недоверенного издателя (Untrusted CA)
// - Истекший срок действия сертификата
WinHttp.Option(4, 13056);
WinHttp.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
WinHttp.SetRequestHeader("Content-Length", СтрДлина(СтрокаОтправки));
WinHttp.Send(СтрокаОтправки);
КодСостояния = WinHttp.Status;
Если КодСостояния = 200 Тогда
Возврат WinHttp.ResponseText;
Иначе
ВызватьИсключение "Сервер вернул код ошибки: " + КодСостояния;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Интеграция.ОшибкаSSL", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
ВызватьИсключение "Не удалось выполнить запрос: " + КраткоеПредставлениеОшибки(ОписаниеОшибки());
КонецПопытки;
КонецФункции
Преимущества данного метода:
Важное ограничение: Данное решение будет работать исключительно на серверах под управлением ОС Windows. Если ваш сервер приложений 1С работает под управлением Linux, COM-объекты использовать не получится — в этом случае необходимо настраивать валидацию сертификатов через ЗащищенноеСоединениеOpenSSL, как описано в первых трех пунктах.