Python 3.7.1未加载默认路径CA证书问题求助
为什么Python的requests没加载我放到默认路径的证书?
这问题我之前也碰到过,核心原因其实是requests库默认的CA证书来源和你以为的不一样,咱们一步步拆解:
核心原因:requests默认用certifi的证书,而非系统/ssl模块的默认路径
你用ssl.get_default_verify_paths()看到的是系统OpenSSL的默认CA路径,但requests库为了跨平台一致性,默认并不使用这个路径——它依赖的是certifi这个第三方库提供的Mozilla维护的标准CA证书集合。所以你把证书加到系统SSL路径里,requests根本没去读。
你可以验证这一点:在Python里执行下面的代码,看看certifi的证书路径和ssl模块显示的是不是完全不同:
import certifi print(certifi.where())
解决办法(三种可选)
1. 把证书追加到certifi的证书文件里
找到certifi的路径后,用终端命令把你的证书bundle追加进去(注意需要对应权限):
cat /usr/lib/ssl/cert.pem >> $(python -c "import certifi; print(certifi.where())")
这样requests就会自动包含你的自定义证书了。
2. 设置环境变量让requests优先用你的证书
设置REQUESTS_CA_BUNDLE环境变量指向你的证书文件,这样所有requests请求都会默认使用这个证书:
# 临时生效(当前终端会话) export REQUESTS_CA_BUNDLE=/usr/lib/ssl/cert.pem # 永久生效(加到~/.bashrc或~/.profile里) echo "export REQUESTS_CA_BUNDLE=/usr/lib/ssl/cert.pem" >> ~/.bashrc source ~/.bashrc
3. 在代码里修改requests的默认配置
如果不想改系统设置,可以在代码开头直接指定requests的默认CA路径:
import requests import requests.utils # 替换成你的证书路径 requests.utils.DEFAULT_CA_BUNDLE_PATH = '/usr/lib/ssl/cert.pem' # 之后的请求就不用加verify参数了 response = requests.get('https://westeurope.experiments.azureml.net')
额外说明:关于你遇到的530状态码
你指定verify参数后返回530,这说明SSL验证已经通过了,530是Azure那边的返回逻辑(可能是访问权限、区域限制或者其他服务端配置问题),和证书加载无关——你现在的核心问题已经解决SSL验证部分,530可以单独排查Azure的服务配置。
内容的提问来源于stack exchange,提问作者Gigi
相关产品推荐
相关产品推荐

