#Что означает ошибка
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 | Получите доверенный корпоративный корневой сертификат у администратора. |
| Неверные дата и время | Системная дата сильно неверна | Исправьте время и часовой пояс, затем повторите защищённое соединение. |
#Пошаговое решение
- Обновите 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 модуль. - Для macOS запустите Install Certificates.commandТолько для Python, установленного с официального установщика python.org на macOS, откройте Finder → «Программы» → папку «Python 3.x» →
Install Certificates.commandи следуйте инструкциям. Для Homebrew, pyenv и системного Python такой файл может отсутствовать — это нормально: сертификаты управляются иначе. Проверьте повторный HTTPS-запрос из того же интерпретатора; если ошибка осталась, не скачивайте случайные корневые сертификаты с форумов. - Проверьте цепочку сертификатов сервераЕсли ошибка воспроизводится только на конкретном веб-сайте, проверьте его адрес и сертификат в обычном браузере; при предупреждении браузера не вводите пароли и не обходите защиту. Администратор сервера может проверить полную цепочку и совпадение имени через
openssl s_client -connect example.com:443 -servername example.com -showcerts(заменив домен), затем исправить установку промежуточных сертификатов на сервере. Успешное соединение openssl само по себе не всегда означает успешную проверку доверия; рассматривайте текстVerify return code. Пользователь чужого сайта не должен изменять его сертификат. - Для корпоративной сети укажите свой CAЕсли сбой возникает только в корпоративной сети, узнайте у администратора, используется ли разрешённый корпоративный центр сертификации при проверке HTTPS. Получите его сертификат через официальный внутренний канал. Для requests можно настроить
REQUESTS_CA_BUNDLEна проверенный файл PEM, но это не универсальная настройка Python: другая библиотека может читать системное хранилище илиSSL_CERT_FILE. Сохраните прежние значения переменных окружения для отката и повторите запрос. Не добавляйте случайные сертификаты и не отключайте системную защиту. - Не отключайте проверкуНикогда не исправляйте эту ошибку установкой
verify=False,PYTHONHTTPSVERIFY=0или отключением проверки имени хоста: соединение станет уязвимым для подмены. Если проблема не решена, предоставьте администратору точный traceback (без секретов), версию Python, способ установки, домен, состояние браузера и сведения, возникает ли ошибка вне корпоративной сети. Далее исправляется конкретная цепочка сертификатов или конфигурация доверия, а не выключается TLS. - Дополнительная команда по темеLinux · Терминал (Bash)КомандаКоманды диагностики в активном окружении; обновление certifi только если используется соответствующее хранилище сертификатов.
python -m pip show certifipython -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.
openssl s_client -connect example.com:443 -servername example.com -showcerts