#Что произошло и когда проявляется ошибка
requests.exceptions.SSLError при HTTPS означает, что проверка TLS-сертификата не удалась: возможны неправильные часы, неполная цепочка сервера, корпоративный прокси или несовпадение имени сайта. Отключать проверку verify=False нельзя.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Проблема сертификата сервераСертификат просрочен, выдан на другое имя либо цепочка неполная. | В браузере для того же домена предупреждение об удостоверении | Исправить серверный сертификат или сообщить владельцу. |
| Старое хранилище доверияPython/библиотека не знают удостоверяющий центр. | На одном компьютере запрос работает, на другом — нет | Проверить версии и корпоративные доверенные корневые сертификаты. |
| TLS-перехват в сетиПрокси подставляет сертификат организации. | В офисе ошибка есть, дома нет | Получить доверенный CA у администратора, не отключать TLS. |
#Подробная пошаговая диагностика и исправление
- 1. Запишите текст ошибки и адресВ терминале запустите небольшой тест с публичным HTTPS-адресом, на который у вас есть разрешение обращаться; не включайте токены в вывод. Сохраните тип исключения и доменное имя:
CERTIFICATE_VERIFY_FAILED,hostname mismatchи сбой соединения имеют разные причины. - Пример кода по темеPythonОбразец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
import requests try: r = requests.get("https://www.python.org/", timeout=(5, 20)) print(r.status_code) except requests.exceptions.SSLError as exc: print(type(exc).__name__, str(exc)[:250])
- 2. Проверьте системные часы и адрес сайтаОткройте настройки даты и времени ОС и сравните дату, время и часовой пояс. Затем откройте тот же HTTPS-адрес в современном браузере; изучите сведения о сертификате через значок безопасности и сообщение браузера. Если браузер тоже ругается, сначала исправляйте сертификат на сервере, а не код клиента.
- 3. Уточните Python, Requests и источник доверияПроверьте версии пакетов именно тем интерпретатором, который запускает приложение. Не обновляйте на боевом сервере вслепую; создайте отдельную копию виртуального окружения.
certifi.where()показывает используемый пакет сертификатов, но системные и корпоративные настройки могут влиять на доверие по-разному.Linux · Терминал (Bash)КомандаКоманда только выводит версии и путь к хранилищу; запуск в окружении приложения.python -c "import requests,certifi; print(requests.__version__); print(certifi.where())"
- 4. При корпоративном удостоверяющем центре используйте проверенный CAЕсли компания перехватывает TLS, запросите у администратора сертификат удостоверяющего центра из проверенного канала и подтвердите его отпечаток. В тестовой копии укажите путь к доверенному набору сертификатов параметром
verify=; файл должен содержать корректный набор CA, а не произвольный сертификат сайта. - Пример для Linux/macOS; на Windows используйте абсолютный путь к утверждённому файлу CAPythonПример для Linux/macOS; на Windows используйте абсолютный путь к утверждённому файлу CA.
requests.get("https://example.com/", timeout=(5, 20), verify="/path/to/trusted-ca-bundle.pem")
- 5. Верните строгую проверку и повторите запросУбедитесь, что
verifyвключён, URL совпадает с именем в сертификате и запрос завершился ожидаемым HTTP-ответом. Код 401/403 подтверждает, что TLS уже прошёл, а доступ запрещён по другим причинам. Не используйтеverify=Falseи не отключайте предупреждения urllib3 ради «исправления».
#Как проверить, что проблема устранена
HTTPS-соединение устанавливается с включённой проверкой сертификатов; проблема подтверждённо решена на стороне цепочки, доверия или имени.
#Если исправление не помогло
Если ошибка осталась только на конкретном сервере, администратору нужен текст ошибки, домен и сведения о цепочке без закрытых ключей. Не скачивайте корневые сертификаты из случайных форумов.