Как исправить ошибку инициализации SSL-соединения при работе с Telegram API из 1С?

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

При реализации интеграции 1С с мессенджером Telegram разработчики часто сталкиваются с ошибкой: «Ошибка работы с Интернет: Ошибка инициализации SSL-соединения». Эта проблема может иметь несколько корней: от блокировок ресурсов на уровне провайдера до несоответствия протоколов безопасности TLS. В данной статье мы подробно разберем, как диагностировать и устранить эту ошибку, используя различные подходы.

Анализ причин возникновения ошибки SSL

Прежде всего, разберем ситуацию, описанную в исходном вопросе. Автор пытается отправить сообщение, используя стандартный объект HTTPСоединение и ЗащищенноеСоединениеOpenSSL. Ошибка возникает на этапе выполнения метода ОтправитьДляОбработки. Рассмотрим основные причины, по которым это происходит:

  1. Блокировка ресурса: Домен api.telegram.org может быть недоступен напрямую из вашей сети. Если сервер 1С не может установить базовое соединение, инициализация SSL прервется.
  2. Версии протокола TLS: Telegram API требует использования протоколов TLS 1.2 или выше. Устаревшие версии платформы 1С или старые операционные системы (например, Windows Server 2008 без обновлений) могут пытаться использовать TLS 1.0, что приводит к сбросу соединения.
  3. Проблемы с сертификатами: 1С использует встроенную библиотеку OpenSSL. Если в ее хранилище (файл cacert.pem) отсутствуют корневые сертификаты удостоверяющих центров, которые использует Telegram, соединение будет признано небезопасным.
  4. Неправильная настройка прокси: Если для обхода блокировок используется прокси-сервер, его некорректная настройка в коде 1С также вызывает ошибки на уровне транспортного протокола.

Решение №1: Использование системных библиотек Windows через COM

Рассмотрим альтернативный способ отправки запросов, предложенный в обсуждении. Если встроенные механизмы 1С (OpenSSL) дают сбой, мы можем воспользоваться системным объектом WinHttp.WinHttpRequest.5.1. Преимущество этого метода в том, что он использует настройки безопасности самой операционной системы Windows.

Проанализируем пример кода с использованием этого объекта:


WinHttpRequest = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Установка таймаутов: разрешение, соединение, отправка, получение (в мс)
WinHttpRequest.SetTimeouts(30000, 30000, 30000, 30000);

// Опция 4: Игнорировать ошибки SSL (флаг 13056 позволяет обходить проблемы с сертификатами)
WinHttpRequest.Option(4, 13056); 

// Опция 9: Принудительное использование TLS 1.2 (значение 2048)
// Это критично для работы с современными API
Попытка
    WinHttpRequest.Option(9, 2048);
Исключение
    // Если ОС не поддерживает TLS 1.2, этот параметр может вызвать ошибку
КонецПопытки;

URL = "https://api.telegram.org/bot" + Токен + "/sendMessage";
WinHttpRequest.Open("POST", URL, Ложь);
WinHttpRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");

ТекстЗапроса = "chat_id=" + Формат(IDЧата, "ЧГ=") + "&text=" + КодироватьСтроку(Сообщение, СпособКодированияСтроки.КодировкаURL);

Попытка
    WinHttpRequest.Send(ТекстЗапроса);
    ОтветТекст = WinHttpRequest.ResponseText;
    КодСтатуса = WinHttpRequest.Status;
Исключение
    Сообщить("Ошибка при отправке через WinHTTP: " + ОписаниеОшибки());
КонецПопытки;

Этот метод часто помогает, если проблема кроется в специфических настройках OpenSSL внутри 1С. Однако помните, что использование COMОбъект привязывает ваше решение к платформе Windows.

Решение №2: Настройка работы через Proxy в 1С

Выясним, как правильно настроить прокси-сервер, если прямой доступ к серверам Telegram закрыт. В платформе 1С для этого используется объект ИнтернетПрокси. Разберем типичную ошибку из сообщения №8 форума, где в строке адреса указывался префикс протокола. Рассмотрим исправленный и расширенный вариант реализации:


Прокси = Новый ИнтернетПрокси;
// Для HTTPS трафика Telegram настраиваем параметры прокси
ПроксиСервер = "192.168.1.100"; // Здесь ваш IP или адрес прокси-сервера
ПроксиПорт = 1080;

// Если используется SOCKS5 (начиная с платформы 8.3.10)
// В некоторых версиях 1С протокол указывается через метод Установить
Прокси.Установить("https", ПроксиСервер, ПроксиПорт, "Пользователь", "Пароль");

// Важный нюанс: для SOCKS5 в последних версиях 8.3 можно явно указать тип
// Но чаще всего 1С сама определяет протокол по настройкам

После создания объекта прокси, его необходимо передать в конструктор HTTPСоединение. Проанализируем правильный порядок параметров:


Сервер = "api.telegram.org";
// Используем пустой или дефолтный сертификат OpenSSL для защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL();

Попытка
    // Пятый параметр конструктора — это наш объект ИнтернетПрокси
    Соединение = Новый HTTPСоединение(Сервер, 443, , , Прокси, 10, Защита);
    
    Запрос = Новый HTTPЗапрос("/bot" + Токен + "/sendMessage");
    // Установка тела запроса и заголовков...
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Исключение
    Сообщить("Ошибка соединения через прокси: " + ОписаниеОшибки());
КонецПопытки;

Решение №3: Обновление доверенных сертификатов (cacert.pem)

Если ошибка SSL сохраняется даже при наличии прямой связи, проблема может быть в том, что 1С не «доверяет» сертификату Telegram. Платформа проверяет цепочку сертификатов, используя файл cacert.pem.

Разберем по шагам процесс обновления этого файла:

  1. Перейдем в каталог установки платформы 1С на сервере (обычно это C:\Program Files\1cv8\номер_версии\bin\).
  2. Найдем файл cacert.pem. Сделаем его резервную копию.
  3. Скачаем актуальный набор корневых сертификатов с проверенного ресурса (например, с официального сайта проекта cURL).
  4. Откроем скачанный файл и содержимое файла 1С в текстовом редакторе.
  5. Заменим содержимое cacert.pem в папке 1С новыми данными или добавим недостающие сертификаты в конец файла.
  6. Важно: После замены файла на сервере необходимо перезапустить службу «Агент сервера 1С:Предприятия», чтобы изменения вступили в силу.

Решение №4: Диагностика через внешние инструменты

Посмотрим на ситуацию шире. Чтобы исключить ошибки в коде 1С, проанализируем доступность API с помощью утилиты curl. Выполните следующую команду в командной строке сервера, где запущена 1С:

curl -v https://api.telegram.org/botТОКЕН/getMe

Что нам это даст?

Разбор ошибки 404 при работе с API

В сообщении №7 автор упоминает ошибку 404. Важно понимать, что 404 — это не ошибка SSL. Это означает, что соединение установлено, но ресурс не найден. Выясним основные причины:

Подводя итог, можно сказать, что решение проблемы с SSL-соединением в 1С требует комплексного подхода: от проверки физической доступности сервера до контроля версий протоколов безопасности. Рассмотрим наиболее стабильный вариант — это сочетание актуальной версии платформы (не ниже 8.3.12) и правильно настроенного прокси-сервера в объекте ИнтернетПрокси.

← На главную