Библиотека requests
проверяет SSL-сертификаты для HTTPS-запросов, как это делает веб-браузер. По умолчанию проверка SSL включена, и запросы выдадут SSLError, если она не сможет проверить сертификат:
>>> import requests >>> requests.get('https://requestb.in') # requests.exceptions.SSLError: hostname 'requestb.in' doesn't match ...
На этом домене нет установленного SSL, поэтому запрос создает исключение. Запрос к GitHub проходит без каких либо ошибок:
>>> requests.get('https://github.com') # <Response [200]>
Можно передать аргументу verify
путь к файлу CA_BUNDLE
или каталогу с доверенными сертификатами CA:
# указание доверенных сертификатов в запросе >>> requests.get('https://github.com', verify='/path/to/certfile') # указание доверенных сертификатов для сессии >>> sess = requests.Session() >>> sess.verify = '/path/to/certfile'
Примечание. Если для параметра verify
задан путь к каталогу, то этот каталог должен быть обработан с помощью утилиты c_rehash
, поставляемой с OpenSSL.
Список доверенных CA также можно указать с помощью переменных сред REQUESTS_CA_BUNDLE
. Если REQUESTS_CA_BUNDLE
не установлена, то CURL_CA_BUNDLE
будет использоваться в качестве запасного варианта.
Запросы также могут игнорировать проверку SSL-сертификата, если для параметра verify
задано значение False
:
>>> requests.get('https://kennethreitz.org', verify=False) # <Response [200]>
Обратите внимание, что если аргумент verify=False
, то запросы будут принимать любой TLS-сертификат, представленный сервером, и будут игнорировать несоответствия имен хостов и/или просроченные сертификаты, что сделает приложение уязвимым для атак man-in-the-middle
(MitM). Установка значения verify
в False
может быть полезна во время локальной разработки или тестирования.
По умолчанию для параметра verify
установлено значение True
. Опция verify
применяется только к сертификатам хоста.
Также можно указать локальный сертификат для использования в качестве сертификата на стороне клиента, как один файл (содержащий закрытый ключ и сертификат) или как кортеж путей к обоим файлам:
>>> requests.get('https://kennethreitz.org', ... cert=('/path/client.cert', '/path/client.key')) # <Response [200]> # для сессии s = requests.Session() s.cert = '/path/client.cert'
Если укать неправильный путь или неверный сертификат, то получим SSLError
:
>>> requests.get('https://kennethreitz.org', cert='/wrong_path/client.pem') # SSLError: [Errno 336265225] _ssl.c:347: error:140B0009:SSL routines:SSL...
Предупреждение. Закрытый ключ к локальному сертификату должен быть незашифрованным. В настоящее время библиотека requests
не поддерживают использование зашифрованных ключей.
Библиотека requests
используют сертификаты из пакета certifi
. Это позволяет пользователям обновлять доверенные сертификаты без изменения версии запросов.
До версии requests-2.16
модуль объединял набор доверенных корневых центров сертификации, полученных из хранилища доверенных сертификатов Mozilla. Сертификаты обновлялись только один раз для каждой версии запросов. Когда не был установлен certifi
, это приводило к чрезвычайно устаревшим пакетам сертификатов при использовании значительно более старых версий запросов.
В целях безопасности команда разработчиков библиотеки requests
рекомендует почаще обновлять сертификаты!