如何让Python请求信任自签名SSL证书?

时间:2015-05-22 21:06:04

标签: python ssl python-requests

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)

但是,我想要做的是将请求指向磁盘上的公钥副本,并告诉它信任该证书。

6 个答案:

答案 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/