Что такое SSL/TLS сертификаты в контексте Python?

Ответ

SSL/TLS сертификат — это цифровой документ, который используется для подтверждения подлинности сервера и шифрования данных, передаваемых между клиентом и сервером по протоколу HTTPS.

Зачем он нужен? Основная задача — предотвратить атаки типа «человек посередине» (Man-in-the-Middle), гарантируя, что клиент общается именно с тем сервером, за который тот себя выдает.

Применение в Python: Библиотеки, такие как requests и httplib, по умолчанию проверяют SSL-сертификат сервера при выполнении HTTPS-запроса. Если сертификат недействителен (просрочен, самоподписанный, выдан недоверенным центром сертификации - CA), выбрасывается исключение ssl.SSLCertVerificationError.

Пример работы с сертификатами в requests:

  1. Небезопасное отключение проверки (только для отладки!):

    import requests
    from requests.packages.urllib3.exceptions import InsecureRequestWarning
    
    # Подавляем предупреждения о небезопасных запросах
    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
    
    # Этот запрос проигнорирует ошибки SSL, что небезопасно в production
    response = requests.get('https://self-signed.badssl.com/', verify=False)
    print(response.status_code)
  2. Правильный подход: указание пути к доверенному сертификату: Если вы работаете с внутренним сервисом, у которого есть свой сертификат, его следует добавить в доверенные.

    import requests
    
    # Указываем путь к файлу сертификата (или бандлу сертификатов)
    response = requests.get('https://internal.service.com', verify='/path/to/your/ca.crt')
    print(response.status_code)