· ~1 мин чтения · Пантюхов Роман Владимирович
Сертификат Минцифры: почему интеграция с внешним API молча перестала получать данные
Всё больше российских сервисов — банки, брокеры, мессенджеры — переводят свои API на сертификаты, выпущенные удостоверяющим центром Минцифры. Для обычного браузера, где корневой сертификат установлен, это незаметно. Для сервера, на котором работает ваша интеграция, — нет: в его хранилище доверенных сертификатов нужного корня может не оказаться.
Что произошло на практике
В проекте с сигналами по акциям рабочий процесс получал котировки у брокера по gRPC. В какой-то момент провайдер сменил сертификат, и запросы начали завершаться ошибкой проверки. Контейнеры при этом оставались запущенными, база была доступна, интерфейс открывался — только данные были старыми. Заметил я это, когда счёт «возраста» последней котировки в проверке состояния перевалил за семь недель.
Почему не помогла «стандартная» настройка
Первая идея — указать путь к файлу с корневым сертификатом через переменную окружения, которую понимает gRPC. В моей связке библиотека её не применила, поэтому подключение по-прежнему не проходило проверку. Рабочее решение — передать сертификат явно при создании защищённого канала: прочитать PEM-файл и передать его содержимое в grpc.ssl_channel_credentials(root_certificates=...). Файл сертификата лежит в репозитории рядом с кодом и копируется в образ.
Тот же класс проблем в другом сервисе
Похожая история была при переезде на новый адрес API мессенджера: в контейнере с воркером не было корня Минцифры, и запросы падали с CERTIFICATE_VERIFY_FAILED. Здесь я не стал менять системные сертификаты всего образа, а создал отдельный SSL-контекст только для клиента этого мессенджера. Так доверие расширяется ровно там, где оно нужно, а остальные соединения остаются как были. Проверять результат нужно живым запросом — в этом случае подтверждением стала успешная публикация, а не просто «тесты зелёные».
Главный вывод: мониторьте свежесть данных
Проверка «процесс жив» ничего не говорит о том, что интеграция работает. Для каждой интеграции стоит выводить время последнего успешного обновления и поднимать тревогу, если оно слишком старое. В моём случае такой показатель уже был в проверке состояния — не хватило только оповещения. Если у вас есть автоматизации, которые тихо зависят от внешних сервисов, интеграцию и мониторинг лучше заложить с самого начала.