上一篇博客已经分析ssl流程,这次直接说报错的结果方法:

对于pip3 安装第三方包失败:

1. 建议直接退出代理charles

2. 命令行前输入: 

export REQUESTS_CA_BUNDLE=~/Documents/charles-ssl-proxying-certificate.pem
, 然后执行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!这一点我感觉非常好!一劳永逸!

python3 SSLCertVerificationError 研究结论_文件写入