Python WindowsmacOSLinux CERTIFICATE_VERIFY_FAILED

Python: ssl.SSLCertVerificationError — certificate verify failed

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

Python не может проверить сертификат: нет актуальных корневых сертификатов (особенно на macOS после установки с python.org), либо трафик перехватывается. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Быстрые решения
  5. Корпоративный прокси и свой сертификат
  6. Чего избегать

#Что означает ошибка

CERTIFICATE_VERIFY_FAILED
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

ssl.SSLCertificateVerifyError: certificate verify failed: unable to get local issuer certificate в Python означает, что библиотека не смогла проверить сертификат сервера. Причины: устаревший пакет сертификатов, корпоративный прокси с подменой сертификата, самоподписанный сертификат или (на macOS) не установлены сертификаты Python.

Отключать проверку (verify=False) опасно: так вы теряете защиту от подмены.

Правильное решение — доверить нужный сертификат или обновить хранилище.

Python не может подтвердить цепочку доверия к конкретному узлу. Причиной могут быть дата/время, ошибка имени/срока сертификата, отсутствующий корневой или промежуточный сертификат, устаревший набор CA либо проверяющий HTTPS корпоративный прокси. Сначала установите причину; обновление certifi поможет только при использовании этого набора доверенных центров.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Нет корневых сертификатовСрок/имя сертификата неверны, ошибка наблюдается и в браузереАдминистратор удалённого сайта должен исправить сертификат или цепочку.
Устаревший certifiПриложение использует устаревшее хранилище доверенных CAОпределите, какое хранилище использует библиотека, обновите доверенные сертификаты из официального источника.
Корпоративный проксиHTTPS проверяется корпоративным прокси с собственным CAПолучите доверенный корпоративный корневой сертификат у администратора.
Неверные дата и времяСистемная дата сильно невернаИсправьте время и часовой пояс, затем повторите защищённое соединение.

#Пошаговое решение

  1. Обновите certifi и PythonЕсли Python выдаёт SSLCertVerificationError, скопируйте адрес сервера и текст причины (unable to get local issuer certificate, certificate has expired или hostname mismatch). На компьютере откройте настройки даты, времени и часового пояса; убедитесь, что время корректно. В активном виртуальном окружении выполните python -m pip --version и, если используется пакет requests с certifi, python -m pip show certifi; обновляйте certifi в том же окружении, где работает приложение: python -m pip install --upgrade certifi. Обновление certifi не решает ошибок имени сервера или его неправильной цепочки и не обязано влиять на стандартный ssl модуль.
  2. Для macOS запустите Install Certificates.commandТолько для Python, установленного с официального установщика python.org на macOS, откройте Finder → «Программы» → папку «Python 3.x» → Install Certificates.command и следуйте инструкциям. Для Homebrew, pyenv и системного Python такой файл может отсутствовать — это нормально: сертификаты управляются иначе. Проверьте повторный HTTPS-запрос из того же интерпретатора; если ошибка осталась, не скачивайте случайные корневые сертификаты с форумов.
  3. Проверьте цепочку сертификатов сервераЕсли ошибка воспроизводится только на конкретном веб-сайте, проверьте его адрес и сертификат в обычном браузере; при предупреждении браузера не вводите пароли и не обходите защиту. Администратор сервера может проверить полную цепочку и совпадение имени через openssl s_client -connect example.com:443 -servername example.com -showcerts (заменив домен), затем исправить установку промежуточных сертификатов на сервере. Успешное соединение openssl само по себе не всегда означает успешную проверку доверия; рассматривайте текст Verify return code. Пользователь чужого сайта не должен изменять его сертификат.
  4. Для корпоративной сети укажите свой CAЕсли сбой возникает только в корпоративной сети, узнайте у администратора, используется ли разрешённый корпоративный центр сертификации при проверке HTTPS. Получите его сертификат через официальный внутренний канал. Для requests можно настроить REQUESTS_CA_BUNDLE на проверенный файл PEM, но это не универсальная настройка Python: другая библиотека может читать системное хранилище или SSL_CERT_FILE. Сохраните прежние значения переменных окружения для отката и повторите запрос. Не добавляйте случайные сертификаты и не отключайте системную защиту.
  5. Не отключайте проверкуНикогда не исправляйте эту ошибку установкой verify=False, PYTHONHTTPSVERIFY=0 или отключением проверки имени хоста: соединение станет уязвимым для подмены. Если проблема не решена, предоставьте администратору точный traceback (без секретов), версию Python, способ установки, домен, состояние браузера и сведения, возникает ли ошибка вне корпоративной сети. Далее исправляется конкретная цепочка сертификатов или конфигурация доверия, а не выключается TLS.
  6. Дополнительная команда по теме
    Linux · Терминал (Bash)Команда
    Команды диагностики в активном окружении; обновление certifi только если используется соответствующее хранилище сертификатов.
    python -m pip show certifi
    python -m pip --version

#Быстрые решения

Для приложения с Requests проверьте текущее окружение и набор certifi, а затем при необходимости обновите его. Install Certificates.command существует в установке Python с python.org на macOS, но отсутствует у многих других сборок. Если браузер также сообщает о недоверенном сертификате, нужно исправлять сертификат/цепочку сайта на стороне его владельца. Не устанавливайте неизвестные CA из интернета.

#Корпоративный прокси и свой сертификат

Только в согласованной корпоративной сети получите официальный сертификат CA у администратора безопасности и сохраните PEM в защищённом месте. Библиотеки Python используют разные хранилища; Requests может читать переменную REQUESTS_CA_BUNDLE, а pip имеет собственные настройки. Не изменяйте глобальные переменные и настройки pip без понимания последствия для других приложений.

#Чего избегать

Не устанавливайте verify=False, PYTHONHTTPSVERIFY=0 и не пропускайте проверку имени узла даже на практике разработки, где это может перейти в рабочую среду. Исправляйте доверенные CA либо серверную цепочку. Для самоподписанного сертификата собственного сервера создайте доверенную инфраструктуру и привяжите к ней нужное приложение, не отключая проверку TLS.

Linux · Терминал (Bash)Команда
Для администратора сервера: замените example.com своим доменом. Это проверка цепочки TLS, не способ обхода защиты.
openssl s_client -connect example.com:443 -servername example.com -showcerts

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.