Перейти к основному содержимому

Самоподписанный сертификат для вебхука

Когда это нужно​

Вебхук работает только по HTTPS: Telegram должен доверять сертификату вашего сервера. Если у вас есть сертификат от доверенного центра сертификации (например, бесплатный Let's Encrypt), эта страница не нужна — подключите такой сертификат по инструкции из пункта 5 страницы Настройка Webhook.

Самоподписанный сертификат — сертификат, который вы создаёте сами, без участия удостоверяющего центра. Он пригодится, когда доверенный сертификат получить нельзя: например, у сервера есть только «белый» IP-адрес без доменного имени, а большинство центров сертификации выпускают сертификаты только на домен.

Информация

Этот способ работает только для Telegram-бота. Для бота MAX самоподписанный сертификат не подходит — почему, читайте в последнем разделе этой страницы.

Требования Telegram к серверу​

Прежде чем начинать, убедитесь, что сервер публикации соответствует требованиям Telegram:

  • адрес сервера — IPv4;
  • открыт один из портов: 443, 80, 88 или 8443;
  • сервер поддерживает TLS версии 1.2 или новее;
  • имя в сертификате совпадает с доменом или IP-адресом из адреса вебхука.

Если на сервере есть межсетевой экран, входящие соединения будут приходить с адресов Telegram — подсетей 149.154.160.0/20 и 91.108.4.0/22. Убедитесь, что для них открыт выбранный порт.

Шаг 1. Создайте сертификат​

Понадобится OpenSSL. На Windows его проще всего взять из состава Git for Windows — он попадает в PATH вместе с Git Bash.

Команда отличается для домена и для IP-адреса — важно указать subjectAltName: Telegram сверяет имя сервера именно по этому полю сертификата (для IP-адреса — только по нему, поле CN он в этом случае не смотрит).

Если у сервера есть доменное имя:

openssl req -newkey rsa:2048 -sha256 -nodes -x509 -days 365 \
-keyout webhook.key -out webhook.pem \
-subj "/CN=bot.example.ru" -addext "subjectAltName=DNS:bot.example.ru"

Если у сервера только IP-адрес:

openssl req -newkey rsa:2048 -sha256 -nodes -x509 -days 365 \
-keyout webhook.key -out webhook.pem \
-subj "/CN=203.0.113.10" -addext "subjectAltName=IP:203.0.113.10"

Замените bot.example.ru и 203.0.113.10 на настоящий адрес вашего сервера. Срок действия сертификата задаёт параметр -days — здесь 365 дней, при необходимости укажите другое число.

Информация

В Git Bash перед командой добавьте MSYS_NO_PATHCONV=1 — без этого Git Bash попытается превратить /CN=... в путь Windows и испортит команду:

MSYS_NO_PATHCONV=1 openssl req -newkey rsa:2048 -sha256 -nodes -x509 -days 365 \
-keyout webhook.key -out webhook.pem \
-subj "/CN=bot.example.ru" -addext "subjectAltName=DNS:bot.example.ru"

Команда создаёт два файла:

  • webhook.key — закрытый ключ. Он остаётся только на веб-сервере, никуда не передаётся и в 1С не загружается;
  • webhook.pem — открытый сертификат. Именно его вы установите на веб-сервер и загрузите в карточку бота.

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

openssl x509 -in webhook.pem -noout -subject -ext subjectAltName -dates

В выводе должны быть строка subject=CN = ... с указанным вами именем, строка X509v3 Subject Alternative Name с тем же именем и корректные даты начала и окончания действия.

Шаг 2. Установите сертификат на веб-сервер публикации​

Дальше сертификат нужно подключить к тому веб-серверу, на котором опубликована информационная база (IIS, Apache или nginx перед веб-сервером 1С).

IIS. Сначала соберите оба файла в один контейнер:

openssl pkcs12 -export -in webhook.pem -inkey webhook.key -out webhook.pfx

Импортируйте webhook.pfx в «Диспетчере служб IIS»: узел сервера → «Сертификаты сервера» → «Импорт». Затем у сайта с публикацией откройте «Привязки», добавьте (или измените) привязку https на нужном порту и выберите импортированный сертификат.

Apache. Понадобится модуль mod_ssl. В конфигурации сайта:

Listen 443
SSLEngine on
SSLCertificateFile /путь/к/webhook.pem
SSLCertificateKeyFile /путь/к/webhook.key

nginx. В конфигурации сервера:

listen 443 ssl;
ssl_certificate /путь/к/webhook.pem;
ssl_certificate_key /путь/к/webhook.key;

После правки конфигурации перезапустите веб-сервер.

Шаг 3. Проверьте сервер​

Прежде чем указывать сертификат в 1С, проверьте его так же, как это сделает Telegram.

Для домена:

openssl s_client -connect bot.example.ru:443 -servername bot.example.ru \
-CAfile webhook.pem -verify_hostname bot.example.ru

Для IP-адреса — вместо -verify_hostname укажите -verify_ip:

openssl s_client -connect 203.0.113.10:443 \
-CAfile webhook.pem -verify_ip 203.0.113.10

В выводе команды должна быть строка Verify return code: 0 (ok). Если код другой — сертификат установлен неправильно или на сервере отвечает не тот сертификат, который вы создали.

Дополнительно откройте в браузере адрес публикации с приставкой /hs/messengers/<ключ вебхука бота>, например https://bot.example.ru/erp/hs/messengers/mykey. Предупреждение браузера о недоверенном сертификате — это нормально: браузер не знает про сертификат, который вы создали сами. Важно, чтобы страница открылась и показала «HTTP-сервис Мессенджеры доступен».

Шаг 4. Укажите сертификат в карточке бота​

  1. Откройте карточку Telegram-бота и установите «Способ взаимодействия» — «Вебхук».
  2. Перейдите на страницу «Настройки Webhook» и заполните адрес публикации и ключ вебхука, как описано на странице Настройка Webhook.
  3. Включите флажок «Самоподписанный сертификат».
  4. Выполните команду «Загрузить сертификат» и выберите файл webhook.pem — тот, что с открытым сертификатом. Файлы .key диалог выбора по умолчанию не показывает. Если закрытый ключ всё же попадёт в карточку (например, файл privkey.pem или файл, где сертификат и ключ вместе), программа его не отправит и сообщит об этом.
  5. Нажмите «Записать» (или «Отправить настройки»).

Если всё сделано правильно, появится сообщение «Вебхук успешно установлен». Если нет — программа объясняет, что не так. Возможные сообщения и что с ними делать:

Сообщение начинается со словЧто делать
«Самоподписанный сертификат не загружен»Файл сертификата не выбран. Выполните команду «Загрузить сертификат» и выберите webhook.pem
«Загруженный файл сертификата содержит закрытый ключ»В карточку загружен файл с закрытым ключом (например, webhook.key, privkey.pem или файл, где сертификат и ключ вместе). Загрузите файл только с открытым сертификатом — webhook.pem
«Загруженный сертификат не в формате PEM»Сертификат в двоичном формате (DER). Преобразуйте его командой openssl x509 -inform der -in файл.cer -out файл.pem и загрузите результат

Шаг 5. Проверьте работу​

Нажмите «Обновить статус» — в ответе должна появиться строка об использовании самоподписанного сертификата, а строки об ошибке доставки быть не должно.

Напишите боту сообщение в Telegram: оно должно появиться в списке входящих сообщений, а бот — ответить по сценарию. Через минуту снова нажмите «Обновить статус» и убедитесь, что ошибки доставки по-прежнему нет.

Если не работает​

  • В статусе вебхука ошибка сертификата. Скорее всего, имя в сертификате не совпадает с доменом или IP-адресом из адреса вебхука, на сервере установлен другой сертификат или в карточку бота загружен не тот файл. Проверьте subjectAltName (шаг 1) и то, какой сертификат в действительности отвечает на сервере (шаг 3).
  • Тайм-аут или нет соединения. Проверьте порт, настройки межсетевого экрана и маршрутизатора — Telegram должен дотягиваться до сервера снаружи.
  • Ошибка ответа сервера. Проверьте адрес публикации и ключ вебхука в карточке бота — вероятно, ошибка в одном из них.

Когда сертификат истечёт​

Самоподписанный сертификат, как и любой другой, действует ограниченный срок (в примерах выше — 365 дней). Когда срок подходит к концу, повторите шаги 1, 2 и 4: создайте новый сертификат, установите его на веб-сервер и загрузите новый файл в карточку бота командой «Загрузить сертификат», затем снова нажмите «Записать».

Почему у MAX так нельзя​

У бота MAX в карточке нет полей сертификата — вместо них показано пояснение, что MAX принимает вебхук только по HTTPS на порту 443 и только с сертификатом, выданным доверенным центром сертификации (например, Let's Encrypt) или Минцифры России. Самоподписанный сертификат MAX не принимает вообще — это ограничение самого мессенджера, программа его обойти не может.

Если у бота MAX флажок «Самоподписанный сертификат» остался включён (например, после того как бот сначала был Telegram-ботом), поле с флажком остаётся видно, чтобы его можно было снять. Пока флажок включён, установка вебхука отказывает с сообщением, что мессенджеру нужен доверенный сертификат.

Что делать боту MAX вместо самоподписанного сертификата:

  • установить на веб-сервер сертификат от доверенного центра сертификации (например, Let's Encrypt) или сервиса Минцифры России;
  • либо не использовать вебхук вовсе — переключить бота на способ «Периодический запрос», для которого публикация базы в интернете не нужна (см. Способы взаимодействия с ботом).