提供SSL证书后Python HTTPS请求仍报SSL错误的原因排查
解决公司代理插入SSL证书导致requests请求失败的问题
问题分析
你遇到的ssl.SSLError: [SSL] PEM lib错误,核心是用错了requests的参数:
cert参数用于指定客户端证书(服务器要求验证客户端身份时使用),而你需要让requests信任公司代理的根证书,应该用verify参数。- conda能正常使用该证书,是因为conda将其加入了信任证书列表,和requests的
verify参数作用逻辑一致。
修正后的代码
把cert替换为verify参数即可:
import requests url = "https://example.com" response = requests.get(url, verify="/temp/certs/certificate.pem")
额外方案:全局配置证书
如果不想每次请求都手动指定证书,可通过两种方式全局配置:
- Windows环境变量方式
在命令行执行以下命令后,运行Python脚本会自动使用该证书:
set REQUESTS_CA_BUNDLE=/temp/certs/certificate.pem
- requests全局配置
在代码中替换默认CA证书路径,后续请求无需再指定verify:
import requests from requests.utils import DEFAULT_CA_BUNDLE_PATH requests.utils.DEFAULT_CA_BUNDLE_PATH = "/temp/certs/certificate.pem" # 直接发起请求即可 response = requests.get("https://example.com")
错误原因补充
之前的PEM lib错误,是因为cert参数要求传入包含客户端证书和对应私钥的PEM文件(或分别指定证书与私钥路径),而你提供的是公司代理的根证书,不符合该参数的格式要求,导致PEM文件解析失败。
内容的提问来源于stack exchange,提问作者jdsp522
相关产品推荐
相关产品推荐

