python3 SSLCertVerificationError 研究结论
上一篇博客已经分析ssl流程,这次直接说报错的结果方法:
对于pip3 安装第三方包失败:
1. 建议直接退出代理charles
2. 命令行前输入:
export REQUESTS_CA_BUNDLE=~/Documents/charles-ssl-proxying-certificate.pem
, 然后执行pip3命令。 这个文件pem可以使用charles导出
, 然后执行pip3命令。 这个文件pem可以使用charles导出
如果需要代理, 也不行输入,就把这个文件写入.zshrc文件吧。 然后source ~/.zshrc
对于自己写的代码:
1. 不退出代理: requests.get('https://www.baidu.com',verify=False)
2. 不退出代理:requests.get('https://www.baidu.com',verify="~/Documents/charles-ssl-proxying-certificate.pem")
3. 不退出代理:检查代理是否存在,如果存在,那么设置环境变量:
1 import requests 2 import os 3 4 if requests.utils.getproxies(): 5 # 设置环境变量 REQUESTS_CA_BUNDLE 6 os.environ['REQUESTS_CA_BUNDLE'] = '/path/Documents/charles-ssl-proxying-certificate.pem' 7 8 print(requests.certs.where()) 9 # 发起请求 10 response = requests.get('https://www.baidu.com') 11 12 # 打印响应内容 13 print(response.text)
4. 退出charles代理
5. 执行脚本前动态设置REQUESTS_CA_BUNDLE或者CURL_CA_BUNDLE
总结:
说了这么多方法, 如果开了代理,其实就一个点,一定要让ca_certs有值, 上面说的环境变量和verify目的都是为了ca_certs有值。或者不验证。注意:这里的不验证其实也是要验证的,
不过用系统默认的设置的证书。 默认证书:/usr/local/etc/openssl@3/cert.pem。 charles 设置代理 restore default会重置这个值
目前符合我的方式,我自己将这个变量REQUESTS_CA_BUNDLE写入了.zshrc文件了, 这样以后不管pip还是python3执行,不管有没有代理,都OK!这一点我感觉非常好!一劳永逸!