问题
你通过 Requests 访问自己搭的(或某个人的)自签名 HTTPS 站点,但是 Requests 抛出了 requests.exceptions.SSLError
。
我们在使用浏览器访问没有验证过的 HTTPS 站点的时候,会弹出是否信任的提示:
这样的安全提示/确认是非常有必要的。因为谁都可以做出一个自签名证书,即这个证书可能来自于中间人攻击1,那么原本用于安全传输 HTTP 协议数据的方式就无效了。因此“确认”某个证书是“安全”的是相当有必要的。
Solution
- 简单的做法
r = requests.get("https://<domain>/", verify=False)
- 对比确认接收到的证书确实是来自该站点的证书
其中,r = requests.get("https://<domain>/", verify='/<path>/<to>/<certfile>')
<certfile>
可能是以.crt
结尾的文件,也可能是以.pem
结尾的文件。 - 重复地写
..., verify='/<path>/<to>/<certfile>'
太麻烦? – 设置环境变量
上面的写法只对当前的终端有效,我假设你知道如何加入到$ export REQUESTS_CA_BUNDLE=/<path>/<to>/<certfile> $ python >>> import requests >>> requests.get("https://<domain>/") <Response [200]>
~/.profile
(or/etc/profile
) 使它“一直有效”。
Reference
- Python Requests throwing SSLError ?
- How to get Python requests to trust a self signed SSL certificate? ?
- requests docs - SSL Cert Verification ?