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)
但是,我想要做的是将请求指向磁盘上的公钥副本,并告诉它信任该证书。
答案 0 :(得分:35)
尝试:
r = requests.post(url, data=data, verify='/path/to/public_key.pem')
答案 1 :(得分:30)
使用verify
参数,您可以提供自定义证书颁发机构捆绑包(http://docs.python-requests.org/en/latest/user/advanced/):
requests.get(url, verify=path_to_bundle)
您可以将证书路径验证通过证书的CA_BUNDLE文件 受信任的CA.此可信CA的列表也可以通过指定 REQUESTS_CA_BUNDLE环境变量。
您还可以指定用作客户端证书的本地证书, 作为单个文件(包含私钥和证书)或 作为文件路径的元组:
>>> requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key'))
<Response [200]>
答案 2 :(得分:3)
需要多个证书的情况解决如下: 将多个根pem文件myCert-A-Root.pem和myCert-B-Root.pem连接到一个文件。然后在我的./。bash_profile中将请求REQUESTS_CA_BUNDLE var设置为该文件。
$ 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
答案 3 :(得分:1)
设置export SSL_CERT_FILE=/path/file.crt
应该可以胜任。
答案 4 :(得分:0)
如果有人碰巧在这里(就像我做的那样)想要为httplib2添加CA(在我的案例中是Charles Proxy),看起来你可以将它附加到python包附带的cacerts.txt
文件中。
例如:
cat ~/Desktop/charles-ssl-proxying-certificate.pem >> /usr/local/google-cloud-sdk/lib/third_party/httplib2/cacerts.txt
其他解决方案中引用的环境变量似乎是特定于请求的,并且在我的测试中未被httplib2选中。
答案 5 :(得分:0)
您可以尝试:
<div class="col_third">
<div class="hover panel">
<div class="front">
<div class="box9">
<p style="font-size:180%; color: white">Kudos!</p>
</div>
</div>
<div class="back">
<div class="box10">
<p style="font-size:180%; color: black">sdasdsadas</p>
</div>
</div>
</div>
</div>
您可以在此处阅读更多内容:http://docs.python-requests.org/en/master/user/advanced/