Как обойти ошибку SSLCertVerificationError при использовании requests в Python и работать с сертификатами
Ошибка SSLCertVerificationError часто возникает при попытке установить соединение с HTTPS-сервером. Это происходит, когда Python не может проверить подлинность SSL-сертификата сайта. Причины могут быть разными: отсутствующие корневые сертификаты, проблемы с сертификатом на сервере или неправильная настройка клиента.
В этой статье я рассмотрю способы обхода этой ошибки, и покажу, что такое SSL-сертификаты и как работать с ними, используя различные инструменты.
🔍 Что такое SSL-сертификат и зачем он нужен?
SSL (Secure Sockets Layer) — это протокол безопасности, который обеспечивает защищённую передачу данных между клиентом и сервером. Он используется для шифрования данных и подтверждения подлинности сервера.
💡 Пример: Алиса и Борис
Представьте, что Алиса хочет отправить Борису важное сообщение, но боится, что кто-то может перехватить его. Для того чтобы удостовериться, что сообщение дошло именно до Бориса, она решает использовать шифрование с сертификатами.
Алиса: она знает, что только Борис может расшифровать сообщение, потому что у него есть приватный ключ.
Борис: он подтверждает свою личность с помощью сертификата, который содержит его публичный ключ. Этот сертификат выдан надёжным центром сертификации, который гарантирует, что Борис действительно является тем, за кого себя выдает.
SSL-сертификат — это как удостоверение личности для веб-сайта, которое помогает избежать MITM-атак (атака «человек посередине») и обеспечивает безопасность передачи данных.
🛠 Способы решения ошибки SSLCertVerificationError
✅ Способ 1: Отключение проверки SSL (не рекомендуется для продакшн-среды)
Наиболее быстрый способ обойти ошибку — это отключить проверку сертификата. Это удобно, когда вы работаете с локальными серверами или сайтами, которым доверяете. Однако важно помнить, что это небезопасное решение.
⚠️ Важно: Использовать verify=False стоит только для доверенных источников и в локальной разработке. В продакшн-средах лучше избегать этого метода.
✅ Способ 2: Установка корневых сертификатов (перманентное решение для Windows)
Если вы используете Windows и у вас отсутствуют корневые сертификаты, вы можете установить их вручную. Это решение обеспечит, чтобы библиотека requests могла корректно проверять сертификаты на всех веб-сайтах.
Инструкция для Windows:
Перейдите в папку установки Python. Например:C:\Users\<твой_пользователь>\AppData\Local\Programs\Python\Python312\
Запустите файл Install Certificates.command (или install_certificates.bat, в зависимости от версии Python).
Это действие установит необходимые корневые сертификаты для вашего Python.
✅ Способ 3: Использование библиотеки certifi
Для того чтобы гарантировать корректную проверку SSL-сертификатов, можно использовать библиотеку certifi, которая поставляется с актуальными корневыми сертификатами.
Этот способ более безопасен, чем отключение проверки SSL, и является хорошей альтернативой для тех, кто не хочет вручную устанавливать сертификаты.
🛠 Как создать SSL-сертификат на Windows?
Для тестирования и локальной разработки можно использовать самоподписанные сертификаты. Мы рассмотрим два способа их создания: через PowerShell и через командную строку (CMD).
🧰 Способ 1: Создание самоподписанного сертификата через PowerShell
PowerShell позволяет быстро создать самоподписанный SSL-сертификат. Вот пример команды:
Экспорт сертификата и ключа:
Вы можете использовать эти сертификаты для тестирования локальных серверов.
🧰 Способ 2: Создание сертификата через командную строку (CMD) с помощью openssl
Если у вас установлен OpenSSL, вы можете использовать его для создания сертификатов через командную строку.
Создание самоподписанного сертификата:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout localhost.key -out localhost.crt -subj "/CN=localhost"
Экспорт сертификата в формат PFX:
openssl pkcs12 -export -out localhost.pfx -inkey localhost.key -in localhost.crt -passout pass:P@ssw0rd123
Если у вас нет OpenSSL, можно использовать makecert.exe:
makecert -r -pe -n "CN=localhost" -b 01/01/2023 -e 01/01/2030 -sky exchange -sv localhost.pvk localhost.cer
pvk2pfx -pvk localhost.pvk -spc localhost.cer -pfx localhost.pfx
Статья на github 👉 https://github.com/hypo69/1001-python-ru/blob/master/articles/ssl_sertifiactes_in_python/ssl_sertifiactes_in_python.md
Удачной разработки, лёгкого кодинга и никаких SSLError! 💻✨🐍