Ответ 1
попробовать:
r = requests.post(url, data=data, verify='/path/to/public_key.pem')
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)
Однако то, что я хотел бы сделать, это точечные запросы к копии открытого ключа на диске и сообщить ему, чтобы он доверял этому сертификату.
попробовать:
r = requests.post(url, data=data, verify='/path/to/public_key.pem')
С параметром 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]>
Проще всего экспортировать переменную 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
Случай, когда требуется несколько сертификатов, был решен следующим образом: Объедините несколько файлов корневого 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
Если кто-то случайно приземлится здесь (как и я), который хочет добавить 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 в моем тестировании.
Настройка export SSL_CERT_FILE=/path/file.crt
должна выполнять задание.
Вы можете попробовать:
settings = s.merge_environment_settings(prepped.url, None, None, None, None)
Вы можете прочитать больше здесь: http://docs.python-requests.org/en/master/user/advanced/