Как исправить ошибку SSL connect error при работе с Telegram API в старых версиях 1С?

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

Многие разработчики, поддерживающие системы на платформе 1С:Предприятие 8.2 или ранних версиях 8.3, столкнулись с внезапным прекращением работы интеграции с Telegram. При попытке отправить сообщение через стандартный объект HTTPСоединение возникает ошибка "SSL connect error". Проанализируем причины этой проблемы и разберем по шагам доступные способы её решения, от простого обновления до настройки "костылей", если переход на новую платформу невозможен.

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

Разберем ситуацию с технической точки зрения. Telegram API постоянно повышает требования к безопасности передаваемых данных. Основная проблема заключается в том, что старые версии 1С используют встроенные библиотеки OpenSSL прошлых поколений, которые не поддерживают современные стандарты шифрования. Рассмотрим ключевые факторы:

  1. Протоколы TLS 1.2 и 1.3: Telegram отказался от поддержки старых протоколов TLS 1.0 и 1.1. Платформы ниже 8.3.9 по умолчанию могут пытаться использовать именно их.
  2. Server Name Indication (SNI): Современные серверы требуют передачи заголовка SNI для правильной маршрутизации SSL-запроса. Старый объект HTTPСоединение в 1С 8.2 часто некорректно формирует этот параметр.
  3. Наборы шифров (Cipher Suites): Telegram перешел на использование алгоритмов на базе эллиптических кривых (ECDHE), которые физически отсутствуют в библиотеках, поставляемых с платформой 8.2.19.

Способ 1. Обновление платформы (Рекомендуемый путь)

Проанализируем сообщения экспертов: наиболее стабильным и правильным решением является обновление технологической платформы. Судя по техническим тестам, полноценная поддержка необходимых протоколов шифрования (TLS 1.2 и выше) появилась в релизах 8.3.9.х и выше.

Важно учитывать, что если ваша конфигурация работает на обычных формах, вы можете установить современную платформу 1С 8.3, сохранив при этом "Режим совместимости" с версией 8.2. Однако, для корректной работы SSL иногда требуется поднять режим совместимости хотя бы до 8.3.8. Рассмотрим алгоритм действий:

  1. Устанавливаем актуальный релиз платформы 1С 8.3 (например, 8.3.23 или выше).
  2. Запускаем информационную базу в режиме Конфигуратора.
  3. Проверяем свойство конфигурации "Режим совместимости". Если SSL все еще выдает ошибку, пробуем постепенно повышать его.

Посмотрим на пример кода, который должен работать на современной платформе без использования прокси:


ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , 30, ЗащищенноеСоединение);
ТекстЗапроса = "bot" + Токен + "/sendMessage?chat_id=" + IDЧата + "&text=" + ТекстСообщения;
Запрос = Новый HTTPЗапрос(ТекстЗапроса);
Ответ = Соединение.Получить(Запрос);

Способ 2. Использование системной утилиты cURL

Если обновление платформы категорически запрещено (например, из-за риска поломать сложную кастомную конфигурацию), воспользуемся тем фактом, что внешние утилиты, такие как cURL, работают с Telegram корректно. Поскольку curl.exe поддерживает современные TLS и умеет работать с SOCKS5, мы можем использовать его как "транспорт".

Разберем, как реализовать вызов через ЗапуститьПриложение. Создадим вспомогательную функцию для отправки сообщения:


Процедура ОтправитьЧерезCurl(Токен, ЧатID, Текст)
    ПутьКCurl = "C:\curl\curl.exe"; // Путь к исполняемому файлу curl
    ПроксиСервер = "socks5://user:pass@127.0.0.1:1080";
    URL = "https://api.telegram.org/bot" + Токен + "/sendMessage";
    Параметры = "-X POST " + URL + " -d chat_id=" + ЧатID + " -d text=" + Текст + " --proxy " + ПроксиСервер;
    
    Команда = ПутьКCurl + " " + Параметры;
    ЗапуститьПриложение(Команда, , Истина); 
КонецПроцедуры

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

Способ 3. Вызов через PowerShell

Системный компонент PowerShell использует возможности .NET Framework, который обновляется независимо от 1С. Рассмотрим вариант использования Invoke-WebRequest. Этот метод особенно хорош тем, что PowerShell версии 5.1 и выше нативно поддерживает TLS 1.2.

Проанализируем пример скрипта, который можно сформировать динамически из 1С:


Скрипт = "
|[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|$url = 'https://api.telegram.org/bot" + Токен + "/sendMessage'
|$body = @{chat_id='" + IDЧата + "'; text='" + Текст + "'}
|Invoke-WebRequest -Uri $url -Method Post -Body $body
|";

ТекстСкрипта = СтрЗаменить(Скрипт, "|", "");
ПутьКФайлу = "C:\temp\tg_send.ps1";
// Записываем ТекстСкрипта в файл и запускаем:
// powershell.exe -ExecutionPolicy Bypass -File C:\temp\tg_send.ps1

Этот способ позволяет избежать проблем с SOCKS5 в объекте WinHttpRequest, так как .NET умеет работать с системными настройками прокси Windows.

Способ 4. Локальный прокси-сервер (Stunnel или Nginx)

Рассмотрим наиболее элегантный архитектурно, но сложный в настройке метод — создание SSL-туннеля. Этот способ позволяет 1С обращаться к Telegram по обычному незащищенному протоколу HTTP на локальный адрес, а внешняя программа будет "оборачивать" этот трафик в современный SSL/TLS.

Проанализируем схему работы через утилиту Stunnel:

  1. Устанавливаем Stunnel на сервер с 1С.
  2. В конфиге Stunnel прописываем прием соединений на порту 8080 и пересылку на api.telegram.org:443.
  3. В коде 1С меняем адрес сервера с api.telegram.org на localhost и порт на 8080.
  4. Параметр ЗащищенноеСоединениеOpenSSL в 1С больше не нужен, так как соединение до локального порта идет по HTTP.

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


// Теперь обращаемся к локальному порту, который проброшен через Stunnel
Соединение = Новый HTTPСоединение("127.0.0.1", 8080); 
ТекстЗапроса = "bot"+ИмяБота+"/sendMessage?chat_id="+Получатель+"&text="+ТекстСообщения;
Запрос = Новый HTTPЗапрос(ТекстЗапроса);
Ответ = Соединение.Получить(Запрос);

Ограничения WinHttpRequest.5.1

Многие пытаются использовать COMОбъект("WinHttp.WinHttpRequest.5.1") в качестве альтернативы. Разберем, почему это не всегда помогает. Хотя WinHTTP в современных версиях Windows (10, 11, Server 2016+) поддерживает TLS 1.2, он крайне плохо работает с SOCKS5 прокси. Если ваш регион требует использования прокси именно этого типа, WinHttpRequest выдаст ошибку или проигнорирует настройки прокси. Кроме того, на старых ОС (Windows Server 2008) поддержку TLS 1.2 в WinHTTP нужно включать принудительно через реестр, что добавляет хлопот системным администраторам.

Подведем итоги

Выясним, какой путь выбрать именно вам:

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

← На главную