Самоподписанный сертификат для вебхука
Когда это нужно
Вебхук работает только по 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. Укажите сертификат в карточке бота
- Откройте карточку Telegram-бота и установите «Способ взаимодействия» — «Вебхук».
- Перейдите на страницу «Настройки Webhook» и заполните адрес публикации и ключ вебхука, как описано на странице Настройка Webhook.
- Включите флажок «Самоподписанный сертификат».
- Выполните команду «Загрузить сертификат» и выберите файл
webhook.pem— тот, что с открытым сертификатом. Файлы.keyдиалог выбора по умолчанию не показывает. Если закрытый ключ всё же попадёт в карточку (например, файлprivkey.pemили файл, где сертификат и ключ вместе), программа его не отправит и сообщит об этом. - Нажмите «Записать» (или «Отправить настройки»).
Если всё сделано правильно, появится сообщение «Вебхук успешно установлен». Если нет — программа объясняет, что не так. Возможные сообщения и что с ними делать:
| Сообщение начинается со слов | Что делать |
|---|---|
| «Самоподписанный сертификат не загружен» | Файл сертификата не выбран. Выполните команду «Загрузить сертификат» и выберите webhook.pem |
| «Загруженный файл сертификата содержит закрытый к люч» | В карточку загружен файл с закрытым ключом (например, webhook.key, privkey.pem или файл, где сертификат и ключ вместе). Загрузите файл только с открытым сертификатом — webhook.pem |
| «Загруженный сертификат не в формате PEM» | Сертификат в двоичном формате (DER). Преобразуйте его командой openssl x509 -inform der -in файл.cer -out файл.pem и загрузите результат |
Шаг 5. Проверьте работу
Нажмите «Обновить статус» — в ответе должна появиться строка об использовании самоподписанного сертификата, а строки об ошибке доставки быть не должно.
Напишите боту сообщение в Telegram: оно должно появиться в списке входящих сообщений, а бот — ответить по сценарию. Через минуту снова нажмите «Обновить статус» и убедитесь, что ошибки доставки по-прежнему нет.