调用API时出现SSL_Certificate错误的原因排查
问题结论
这个问题有较高概率和防火墙、网络代理类网络因素有关,但也存在其他可复现的本地原因。
核心原因说明
正常情况下Python requests 库会依赖内置的certifi根证书库,校验目标服务器返回的SSL证书的签发方可信度、域名匹配度、有效期,全部校验通过才会建立加密连接。
设置verify=False可以绕过所有SSL校验流程直接建立连接,出现这种报错的最常见触发场景就是HTTPS流量被中间网络设备劫持重签:
- 企业防火墙、上网行为管理系统、办公VPN网关这类设备常会开启HTTPS流量审计功能,会拦截所有出站HTTPS请求:设备先代替客户端和目标服务器(HERE Maps)建立合法连接,再给客户端返回一张由设备私有CA签发的域名匹配证书,实现流量解密、审计、再加密转发的流程。
- 这张由私有CA签发的证书不在
requests默认信任的根证书列表里,自然会抛出SSL证书验证失败的错误。
其他可触发同类报错的非网络原因
- 本地Python环境的
certifi根证书库版本过旧,没有收录HERE Maps当前使用的根CA证书,可先执行pip install --upgrade certifi升级后重试排除该问题 - 本地设备系统时间偏差过大,超出目标服务器SSL证书的有效时间范围,导致证书有效期校验失败
- 本地hosts文件被篡改,API请求被指向非官方的第三方站点,返回的证书域名不匹配
注意事项
强烈不建议长期使用verify=False配置,该配置会完全关闭SSL安全校验,传输的API密钥、位置数据等敏感信息存在被窃听、篡改的风险。
如果确认是企业内网防火墙/代理导致的问题,正确的处理方式是联系网络管理员获取对应私有CA的根证书文件,发起请求时将证书路径传入verify参数即可正常调用,示例:
import requests resp = requests.get("https://here.maps.api.endpoint", verify="/path/to/private-ca.crt")
内容的提问来源于stack exchange,提问作者Ravi Yadav
相关产品推荐
相关产品推荐

