如何让Python请求信任自签名SSL证书?
如果URL使用自签名证书,则此操作失败如何让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
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迷宫