【Python】(requests)requests.exceptions.SSLError —— 访问自签名证书 HTTPS 抛出异常



问题

你通过 Requests 访问自己搭的(或某个人的)自签名 HTTPS 站点,但是 Requests 抛出了 requests.exceptions.SSLError

我们在使用浏览器访问没有验证过的 HTTPS 站点的时候,会弹出是否信任的提示:

n/a

这样的安全提示/确认是非常有必要的。因为谁都可以做出一个自签名证书,即这个证书可能来自于中间人攻击1,那么原本用于安全传输 HTTP 协议数据的方式就无效了。因此“确认”某个证书是“安全”的是相当有必要的。



Solution

  1. 简单的做法
    r = requests.get("https://<domain>/", verify=False)
    
  2. 对比确认接收到的证书确实是来自该站点的证书
    r = requests.get("https://<domain>/", verify='/<path>/<to>/<certfile>')
    
    其中,<certfile> 可能是以 .crt 结尾的文件,也可能是以 .pem 结尾的文件。
  3. 重复地写 ..., 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




  1. 中间人攻击:https://www.baidu.com/s?wd=中间人攻击 ↩︎

发布了164 篇原创文章 · 获赞 76 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_29757283/article/details/98323080