CERTIFICATE_VERIFY_FAILED на российском API: как доверять сертификату Минцифры только в одном клиенте Python
Aflubin1978 43 минуты назад Краткое содержание статьи CERTIFICATE_VERIFY_FAILED на российском API: как доверять сертификату Минцифры только в одном клиенте Python Средний 5 мин 731 Python * Информационная безопасность *...
Will Anthropic have the best AI model at the end of October 2026?
В сфере искусственного интеллекта произошло заметное событие. Aflubin1978 43 минуты назад Краткое содержание статьи CERTIFICATE_VERIFY_FAILED на российском API: как доверять сертификату Минцифры только в одном клиенте Python Средний 5 мин 731 Python * Информационная безопасность * Туториал В начале октября я подключал своего бота к API мессенджера MAX, и запросы из aiohttp падали с ClientConnectorCertificateError: certificate verify failed: unable to get local issuer certificate. Сервер подписан цепочкой Минцифры, которой нет в стандартных наборах корневых сертификатов. В статье про перенос бота в MAX решению достался один абзац, здесь разберу его подробно, с рисками и вариантами для httpx и requests.
В моём боте этому сертификату доверяет один клиент в процессе, а системное хранилище, certifi и соединения с Telegram и Anthropic остались как были. Что присылает серверopenssl s_client -connect platform-api2. ru:443 -servername platform-api2.
Технические детали
ru -showcerts Сертификатов в ответе два: *. 2027) и промежуточный Russian Trusted Sub CA (до 19. 2029), который выпустил Russian Trusted Root CA Минцифры.
Корень сервер не присылает, клиент должен найти его у себя. В наборах Debian, certifi и Windows его нет, отсюда и unable to get local issuer certificate. Почему не verify=False и не корень в системуСпособОбластьМинусverify=False, ssl=Falseклиентпроверки нет совсемкорень в образ, update-ca-certificatesвсё, что читает системное хранилищедоверяют curl, aiohttp и urllib с настройками по умолчаниюдописать в certifi/cacert.
pemвсе, кто берёт certifiслетает при обновлении пакетаSSL_CERT_FILE, REQUESTS_CA_BUNDLEпочти весь процессостальные клиенты теряют обычные корни или начинают доверять МинцифрыС verify=False всё просто: токен бота MAX уходит в заголовке Authorization с каждым запросом, и без проверки его прочитает любой посредник на пути. С остальными способами вопрос в области действия. У промежуточного сертификата Минцифры нет расширения Name Constraints, и корень в общем хранилище, системном или certifi, позволит этой цепочке подтверждать любой домен для всех, кто это хранилище читает.
Отраслевые последствия
В моём боте через certifi ходят клиенты Telegram (aiogram) и Anthropic (httpx). Почему этим сертификатам на Хабре не доверяют и как ограничить корень на уровне всей системы, разобрано в статье о том, как не доверять сертификатам Минцифры. Для MAX описан и вариант с корнем в репозитории и своим набором (в разборе граблей Bot API), а близкий к моему подход, для HTTP-клиента банка, есть в статье про архив на Telegram Business API.
Ставить корень Минцифры в систему или в браузер ради одного API я не хотел. Задача была уже: чтобы цепочку признавал один клиент, который ходит на один хост, и больше никто в процессе. Как устроено решениеКод из app/max/client.
py:_CA_FILE = Path(__file__). parent / "certs" / "russian_trusted_sub_ca. pem" def _ssl_context() -> ssl.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




