Как опубликовать HTTP-сервис 1С для вебхуков и решить проблему с SSL-сертификатом?

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

При интеграции 1С с мессенджерами (Telegram, Viber, WhatsApp) разработчики часто сталкиваются с ситуацией, когда созданный HTTP-сервис успешно работает локально или через инструменты отладки типа Fiddler, но блокируется сторонним сервисом. Основная причина кроется в требованиях безопасности: современные мессенджеры не принимают данные по незащищенному протоколу HTTP и крайне строго относятся к валидности SSL-сертификатов. Рассмотрим подробно, как правильно настроить публикацию базы 1С, чтобы вебхуки начали поступать в систему.

Анализ проблемы: почему самоподписанный сертификат не подходит?

Разберем ситуацию, описанную в обсуждении. Автор столкнулся с тем, что внешний сервис отвергает ссылку из-за самоподписанного сертификата. Самоподписанный сертификат — это сертификат, который вы создали сами, и ни один доверенный центр сертификации (CA) его не подтвердил. Для браузеров и автоматических систем (ботов мессенджеров) такое соединение считается небезопасным, так как никто не гарантирует, что на другом конце находится именно ваш сервер.

Многие пытаются решить проблему переходом на обычный HTTP (порт 80), однако это тупиковый путь. Большинство API мессенджеров (например, Telegram Bot API) жестко требуют HTTPS. Поэтому наша задача — настроить полноценное зашифрованное соединение с доверенным сертификатом.

Шаг 1: Получение доменного имени (FQDN)

Проанализируем необходимость домена. SSL-сертификат выдается не на IP-адрес, а на доменное имя (например, api.myserver.ru). Без доменного имени получить бесплатный доверенный сертификат невозможно. Если вы не хотите покупать домен, рассмотрим использование Dynamic DNS (DDNS). Сервисы типа DuckDNS или No-IP позволяют бесплатно получить доменное имя третьего уровня, которое будет автоматически привязано к вашему внешнему IP-адресу.

Для профессиональной работы всё же рекомендуется приобрести домен в зонах .ru или .com. Это стоит недорого, но дает полный контроль над управлением записями DNS.

Шаг 2: Получение бесплатного сертификата Let's Encrypt

Выясним, как получить сертификат, который будет признан всеми сервисами. Оптимальный вариант — использовать Let's Encrypt. Это некоммерческий центр сертификации, предоставляющий сертификаты бесплатно. Однако их срок действия ограничен 90 днями, поэтому крайне важно настроить автоматическое продление.

Для автоматизации на сервере, где установлен Apache, рекомендуется использовать утилиту Certbot. Рассмотрим алгоритм действий:

  1. Устанавливаем Certbot на сервер.
  2. Запускаем команду генерации сертификата, указав ваш домен.
  3. Certbot сам создаст временный файл в директориях Apache для подтверждения владения доменом.
  4. После проверки вы получите файлы fullchain.pem (сертификат) и privkey.pem (закрытый ключ).

Шаг 3: Настройка веб-сервера Apache

Теперь разберем, как прописать полученные сертификаты в конфигурационном файле httpd.conf. Нам необходимо убедиться, что Apache слушает 443 порт и правильно обращается к ключам. Проанализируем пример настройки секции VirtualHost:


Listen 443

<VirtualHost _default_:443>
    ServerName api.myserver.ru
    
    SSLEngine on
    SSLCertificateFile "C:/Certbot/live/api.myserver.ru/fullchain.pem"
    SSLCertificateKeyFile "C:/Certbot/live/api.myserver.ru/privkey.pem"

    # Настройки публикации 1С
    ManagedRuntimeXml "C:/inetpub/wwwroot/mybase/default.vrd"
    
    <Directory "C:/inetpub/wwwroot/mybase/">
        AllowOverride None
        Options None
        Require all granted
    </Directory>
</VirtualHost>

Обратите внимание, что в файле default.vrd, который формируется при публикации базы из конфигуратора 1С, должны быть корректно указаны параметры вашего HTTP-сервиса. Проверьте, что имя сервиса в URL совпадает с тем, что вы передаете в мессенджер.

Шаг 4: Альтернативный метод — использование туннелей (Cloudflare Tunnel)

Если у вас нет "белого" статического IP-адреса или вы находитесь за NAT, рассмотрим более современный и простой способ — Cloudflare Tunnel. Это решение позволяет опубликовать локальный порт Apache в интернет без открытия портов на роутере.

При использовании этого метода Cloudflare сам берет на себя заботу об SSL-сертификате. Ваша база будет доступна по адресу типа https://1c.mydomain.com, и этот сертификат будет доверенным для всех мессенджеров. Настройка сводится к установке небольшого агента (cloudflared) на ваш сервер и привязке его к вашему аккаунту Cloudflare.

Шаг 5: Безопасность и авторизация в 1С

Выясним, как обезопасить нашу базу при публикации в открытый интернет. Критически важно соблюдать следующие правила:

  1. Создайте в 1С отдельного пользователя с минимальными правами. У него не должно быть прав на запуск клиента, только права на использование конкретного HTTP-сервиса и необходимые объекты метаданных.
  2. Используйте Basic Auth. В ссылке для вебхука можно передавать логин и пароль (хотя это менее безопасно) или настроить передачу заголовка Authorization.
  3. В коде самого HTTP-сервиса обязательно делайте проверку входящих данных. Например, мессенджеры часто передают секретный токен, который вы сами задали при регистрации бота.

Рассмотрим пример простейшей обработки запроса в 1С, где мы анализируем входящее сообщение:


Функция УведомлениеPost(Запрос)
    
    // Получаем тело запроса в виде строки
    ДанныеJSON = Запрос.ПолучитьТелоКакСтроку();
    
    // Логируем входящий запрос для отладки
    ЗаписьЖурналаРегистрации("Webhooks", УровеньЖурналаРегистрации.Информация, , , ДанныеJSON);
    
    // Парсим JSON и выполняем бизнес-логику
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ДанныеJSON);
    ОбъектДанных = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
    
    // Возвращаем ответ "ОК" сервису
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки("Запрос обработан");
    Возврат Ответ;

КонецФункции

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

Мы проанализировали ситуацию и выяснили, что для успешной работы вебхуков в 1С необходимо отказаться от использования самоподписанных сертификатов. Основные шаги к решению: получение домена (через покупку или DDNS), генерация бесплатного сертификата через Let's Encrypt и правильная настройка Apache. В качестве альтернативы для сложных сетевых условий мы рассмотрели использование туннелей, которые значительно упрощают процесс публикации. Следуя этим инструкциям, вы сможете настроить стабильный обмен данными между 1С и любыми современными внешними сервисами.

← На главную