#Что происходит и как распознать неисправность
Ошибка [SSL: CERTIFICATE_VERIFY_FAILED] появляется во время защищённого HTTPS-соединения. Это не обязательно ошибка самого Python: сертификат может быть просрочен, выдан не для указанного имени, недоверен окружению или заменяться корпоративным посредником.
#Как отличить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Ошибка имени или срока сертификатаAPI выдаёт сертификат для другого имени либо с истёкшим сроком. | Браузер на том же адресе сообщает о сертификате; URL отличается от документации API. | Исправьте имя узла или обратитесь к администратору сервера. |
| Недоверенный центр сертификацииОкружение Python не знает нужный корневой сертификат. | Браузер работает на управляемом ПК, а Python в контейнере — нет. | Получите проверенный сертификат у администратора и настройте доверие. |
| Перехват HTTPS проксиПрокси подменяет сертификат на корпоративный. | В офисной сети ошибка есть, в разрешённой другой сети — нет. | Согласуйте настройку доверия и прокси, не отключая проверку TLS. |
#Пошаговая диагностика и исправление
- Скопируйте точный код ошибки без секретовВ терминале IDE запустите проблемный запрос и запишите текст
certificate verify failed, имя узла и используемую библиотеку (requests,urllib,httpx). Не публикуйте полный URL, если он содержит ключ или токен в параметрах. Если виден не SSL-код, аConnection refused/NameResolutionError, сначала диагностируйте сеть. - Уточните правильный адрес и сертификат сервераОткройте браузер, введите тот же HTTPS-адрес API, но без токенов и секретных путей, и посмотрите сведения о защищённом соединении через значок слева от адреса (расположение зависит от браузера). Проверьте правильность имени и срок действия. Если сертификат недействителен в браузере, прекратите запросы и свяжитесь с владельцем API.
- Проверьте дату и часовой пояс системыВ Windows откройте «Параметры → Время и язык → Дата и время», а в Linux выполните
date -Isв терминале. Если часы заметно неверны, исправьте их штатной синхронизацией с разрешённым сервером времени. Повторите запрос; сертификаты проверяют время действия. Если время верное, переходите дальше. - Сверьте запускаемый Python и версию библиотекиОткройте терминал проекта и выполните
python -c "import sys; print(sys.executable)". Для requests выполнитеpython -m pip show requests certifi; убедитесь, что команды относятся к интерпретатору приложения. Если приложение запускается в контейнере, проверять пакеты нужно внутри контейнера; установка на хосте не меняет контейнер. - Проверьте доверенные центры без отключения проверкиЕсли используется requests, посмотрите путь набора доверенных CA через
python -c "import requests; print(requests.certs.where())". Если библиотека или доверенное хранилище устарели, обновляйте пакеты в тестовом окружении согласно требованиям проекта. Для служебного API с собственным CA запросите у администратора подлинный сертификат доверенного центра и одобренный способ его установки. - Отдельно проверьте корпоративный прокси и переменныеПроверьте, использует ли программа HTTPS_PROXY или REQUESTS_CA_BUNDLE, не выводя в общий журнал секреты прокси. При
requestsдоверенный файл CA можно указать параметромverify="/реальный/путь/ca.pem", только если файл получен из проверенного источника. Если вы используете подготовленные запросыPreparedRequest, настройки окружения могут не применяться автоматически — проверьтеmerge_environment_settingsпо документации requests. - Повторите запрос и при неуспехе передайте сведенияПосле корректной настройки сделайте штатный запрос к API; успешное TLS-соединение не гарантирует код HTTP 200 — сервер может вернуть 401 или 403 из-за авторизации, это другая задача. Если ошибка остаётся, сохраните домен без секретов, ОС, версию Python, текст ошибки и сведения об издателе сертификата и обратитесь к администратору API. Любую временно добавленную настройку CA отменяйте, если она не подходит.
#Команды и примеры для проверки
python -c "import sys; print(sys.executable)"python -m pip show requests certifiimport requests
url = "https://api.example.org/status" # замените на реальный публичный адрес API
response = requests.get(url, timeout=10)
print(response.status_code)#Как проверить результат и что делать дальше
Правильная проверка: HTTPS-соединение проходит с включённой верификацией сертификата; дальнейшая HTTP-ошибка рассматривается отдельно. Если нужно проверить другой сертификат, не отключайте verify и не доверяйте случайным файлам из интернета.