Подтвердить что ты не робот

Как заставить запросы Python доверять самоподписанному сертификату SSL?

import requests
data = {'foo':'bar'}
url = 'https://foo.com/bar'
r = requests.post(url, data=data)

Если URL-адрес использует самоподписанный сертификат, это не выполняется с помощью

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Я знаю, что я могу передать False в параметр verify, например:

r = requests.post(url, data=data, verify=False)

Однако то, что я хотел бы сделать, это точечные запросы к копии открытого ключа на диске и сообщить ему, чтобы он доверял этому сертификату.

4b9b3361

Ответ 1

попробовать:

r = requests.post(url, data=data, verify='/path/to/public_key.pem')

Ответ 2

С параметром verify вы можете предоставить собственный набор сертификатов (http://docs.python-requests.org/en/latest/user/advanced/):

requests.get(url, verify=path_to_bundle)

Вы можете передать путь к файлу CA_BUNDLE с сертификатами доверенных ЦС. Этот список доверенных ЦС также может быть указан через переменная среды REQUESTS_CA_BUNDLE.

Вы также можете указать локальный сертификат для использования в качестве сертификата на стороне клиента, как отдельный файл (содержащий закрытый ключ и сертификат) или как кортеж обоих путей файлов:

>>> requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key'))
<Response [200]>

Ответ 3

Проще всего экспортировать переменную REQUESTS_CA_BUNDLE, которая указывает на ваш собственный центр сертификации или конкретный комплект сертификатов. В командной строке вы можете сделать следующее:

export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem
python script.py

Если у вас есть центр сертификации, и вы не хотите вводить export каждый раз, когда вы можете добавить REQUESTS_CA_BUNDLE в свой ~/.bash_profile следующим образом:

echo "export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem" >> ~/.bash_profile ; source ~/.bash_profile

Ответ 4

Случай, когда требуется несколько сертификатов, был решен следующим образом: Объедините несколько файлов корневого pem, myCert-A-Root.pem и myCert-B-Root.pem, в файл. Затем установите запросы REQUESTS_CA_BUNDLE var в этот файл в моем. /. Bash_profile.

$ cp myCert-A-Root.pem ca_roots.pem
$ cat myCert-B-Root.pem >> ca_roots.pem
$ echo "export REQUESTS_CA_BUNDLE=~/PATH_TO/CA_CHAIN/ca_roots.pem" >> ~/.bash_profile ; source ~/.bash_profile

Ответ 5

Если кто-то случайно приземлится здесь (как и я), который хочет добавить CA (в моем случае Charles Proxy) для httplib2, похоже, вы можете добавить его в файл cacerts.txt, включенный в пакет python.

Например:

cat ~/Desktop/charles-ssl-proxying-certificate.pem >> /usr/local/google-cloud-sdk/lib/third_party/httplib2/cacerts.txt

Переменные среды, на которые ссылаются в других решениях, выглядят специфичными для запросов и не были отобраны httplib2 в моем тестировании.

Ответ 6

Настройка export SSL_CERT_FILE=/path/file.crt должна выполнять задание.