Разберем распространенную и крайне неприятную проблему, с которой часто сталкиваются разработчики при интеграции 1С с внешними веб-сервисами по протоколу HTTPS. Ошибка заявляет о себе следующим системным сообщением: «Ошибка при вызове метода контекста (Получить): Ошибка работы с Интернет: Ошибка инициализации SSL-соединения». Самое коварное в этой ситуации — ее нестабильный, «плавающий» характер: в большинстве случаев запросы проходят успешно, но периодически сессия обрывается без видимых изменений в коде или настройках программы.
Проанализируем глубокие технические причины такого поведения платформы 1С и сетевой подсистемы операционной системы, а также рассмотрим пошаговые сценарии решения проблемы.
Выясним, как платформа 1С по умолчанию оптимизирует работу с сетевыми протоколами. Для ускорения обмена данными 1С использует механизм постоянных HTTP-соединений (так называемый Keep-Alive) и кэширует открытые TCP/SSL-сессии во внутреннем пуле для их повторного использования.
Рассмотрим детально этот процесс:
GET платформа 1С успешно инициализирует защищенное соединение и выполняет SSL-согласование (Handshake).GET.Чтобы исправить это поведение, мы должны принудительно указать веб-серверу закрывать соединение сразу после обработки запроса. Для этого добавим в заголовки запроса директиву закрытия сессии Connection: close. Посмотрим на пример кода:
// Создаем запрос к ресурсу
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
// Добавляем заголовок для отключения Keep-Alive
HTTPЗапрос.Заголовки.Вставить("Connection", "close");
// Инициализируем защищенное соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(ИмяСервера, , , , , 60, ЗащищенноеСоединение);
// Выполняем запрос
HTTPОтвет = Соединение.GET(HTTPЗапрос);
Как справедливо заметил автор обсуждения, попытка обернуть в блок Попытка...Исключение инициализацию самого объекта HTTPСоединение не решает проблему, поскольку физическое сетевое подключение и проверка сертификатов происходят непосредственно в момент вызова метода GET (или ВызватьHTTPМетод).
Если на линии связи происходят микросбои (потери пакетов, что отчетливо видно по «звездочкам» в трассировке маршрута tracert), процесс SSL-рукопожатия прерывается. Нам необходимо внедрить механизм автоматического повторения запроса с небольшой технологической паузой. Разберем, как правильно реализовать такой цикл:
МаксПопыток = 3;
Успешно = Ложь;
Для НомерПопытки = 1 По МаксПопыток Цикл
Попытка
// Выполняем сетевой запрос
HTTPОтвет = Соединение.GET(HTTPЗапрос);
Успешно = Истина;
Прервать; // Выходим из цикла, если запрос прошел успешно
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("Интеграция.ОшибкаSSL",
УровеньЖурналаРегистрации.Предупреждение,
,
,
"Попытка " + НомерПопытки + " завершилась ошибкой: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
// Если попытки не исчерпаны, делаем паузу перед следующим обращением
Если НомерПопытки < МаксПопыток Тогда
// Приостанавливаем выполнение на 1.5 - 2 секунды
Приостановить(2);
КонецЕсли;
КонецПопытки;
КонецЦикла;
Если Не Успешно Тогда
ВызватьИсключение "Не удалось установить защищенное соединение после " + МаксПопыток + " попыток.";
КонецЕсли;
По умолчанию встроенный в 1С криптографический модуль OpenSSL обращается к локальному файлу корневых сертификатов cacert.pem, который находится в каталоге установки платформы (папка bin). Если этот файл устарел, а целевой сайт использует динамически обновляемые SSL-сертификаты (например, Let's Encrypt или государственные сертификаты Минцифры), проверка цепочки доверия будет периодически сбоить.
Рекомендуется перевести проверку подлинности SSL-сертификатов на использование системного хранилища операционной системы Windows, которое обновляется автоматически самой ОС. Разберем программную реализацию:
// Инициализируем сертификаты из системного хранилища Windows
СертификатыWindows = Новый СертификатыУдостоверяющихЦентровWindows();
// Передаем системные сертификаты в защищенное соединение OpenSSL
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, СертификатыWindows);
// Создаем HTTPСоединение с использованием настроенной защиты
Соединение = Новый HTTPСоединение(ИмяСервера, , , , , 60, ЗащищенноеСоединение);
Даже если пользователь полностью приостановил работу антивируса (например, Kaspersky), его низкоуровневые сетевые компоненты (NDIS-фильтры и драйверы перехвата трафика) остаются активными в сетевом стеке операционной системы. Они продолжают перехватывать пакеты на портах 80 и 443 для проверки шифрованного трафика (функция HTTPS-фильтрации).
Любая микрозадержка при анализе пакетов или несовместимость версии драйвера антивируса с библиотеками OpenSSL платформы 1С приводит к мгновенному обрыву SSL Handshake. Для решения этой проблемы выполним следующие действия:
1cv8.exe для клиентских сессий и rphost.exe для сервера приложений 1С) в список исключений сетевого экрана и исключите их из сканирования зашифрованного трафика.Если для доменного имени сайта в DNS прописаны одновременно адреса IPv4 и IPv6, операционная система Windows 10 по умолчанию будет отдавать приоритет протоколу IPv6. Если ваш интернет-провайдер или локальный маршрутизатор некорректно обрабатывает или блокирует IPv6-пакеты, при обращении 1С к IPv6-адресу соединение будет обрываться на этапе согласования SSL.
Выясним, как исключить этот фактор:
Применение комплекса мер — отключение постоянных соединений с помощью заголовка Connection: close, переключение валидации на системные сертификаты Windows и реализация устойчивого цикла повторов — позволяет полностью ликвидировать плавающие ошибки SSL-инициализации при интеграционных процессах в 1С.