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

如何让Python请求信任自签名SSL证书?,python,ssl,python-requests,Python,Ssl,Python Requests,如果URL使用自签名证书,则此操作失败 import requests data = {'foo':'bar'} url = 'https://foo.com/bar' r = requests.post(url, data=data) 我知道我可以将False传递给verify参数,如下所示: requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERT

如果URL使用自签名证书,则此操作失败

import requests
data = {'foo':'bar'}
url = 'https://foo.com/bar'
r = requests.post(url, data=data)
我知道我可以将
False
传递给
verify
参数,如下所示:

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
但是,我想做的是将请求指向磁盘上的公钥副本,并告诉它信任该证书。

尝试:

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

使用
verify
参数,可以提供自定义证书颁发机构捆绑包

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

您可以传递
verify
到具有证书的CA_BUNDLE文件的路径 信任的CAs。还可以通过指定受信任CA的列表 REQUESTS\u CA\u BUNDLE环境变量


最简单的方法是导出变量
REQUESTS\u CA\u BUNDLE
,该变量指向您的私有证书颁发机构或特定的证书捆绑包。在命令行上,可以按如下方式执行此操作:

requests.get(url, verify=path_to_bundle_file)
export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem
python script.py
如果您拥有证书颁发机构,并且不想每次都键入
export
,则可以将
请求\u CA\u BUNDLE
添加到
~/.bash\u配置文件中,如下所示:

requests.get(url, verify=path_to_bundle_file)
export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem
python script.py

需要多个证书的情况解决如下: 将多个根pem文件myCert-A-root.pem和myCert-B-root.pem连接到一个文件。然后将requests\u CA\u BUNDLE var设置为my./.bash\u配置文件中的该文件

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

如果有人(像我一样)碰巧来到这里,想要为httplib2添加CA(在我的例子中是Charles代理),那么您可以将其附加到python包中包含的
cacerts.txt
文件中

例如:

$ 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

其他解决方案中引用的环境变量似乎是特定于请求的,httplib2在我的测试中没有检测到这些变量。

设置
导出SSL证书文件=/path/FILE。crt
应该可以完成这项工作。

您可以尝试:

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

你可以在这里阅读更多内容:

那是我一天中的“啊哈”时刻。。。谢谢。。。有了这个提示,我得到了我自己签署的jira证书去工作…;-)我知道可能有上百个网站和答案描述了这一点,但我找到了你的,所以你得到了我的信任,因为你帮助我解决了我的问题。。。dco是否可以执行相同的操作并同时使用客户端证书?我对此有问题。请注意,您传递的.pem文件必须包括服务器的证书和任何中间证书。我花了几个小时试图弄清楚为什么在添加服务器证书后它不起作用。我添加了自签名certificate.pem,它起了作用。这种技术对我不起作用。我使用
ssl.get_server\u certificate
下载
(self-signed.badsl.com,443)
的证书,将该证书保存到
cert.pem
,然后运行
请求。get('https://self-signed.badssl.com/,verify='cert.pem')
但仍然失败,并出现SSL错误(该证书是自签名的)。供参考(可能是为了我未来的自我),我必须通过点击Firefox中的锁图标>显示连接详细信息>更多信息>查看证书>下载“pem(链)”,将证书作为.pem文件下载。作为替代“pem(证书)”,链是我遗漏的重要部分无法处理请求。环境变量是让PyCharm处理存储在OpenSSL证书文件中的证书所需的。我在链中有一个自签名证书。此解决方案解决了boto3库的问题。谢谢。适合我(而
requests\u CA\u BUNDLE
变量在我的情况下无效).在哪里执行这个命令?在你的终点站是的,那个旧的readthedocs迷宫