这类问题我又碰上了一次。内网模型网关换成自签证书,Python 脚本报 SSLError: certificate verify failed: unable to get local issuer certificate,用浏览器手动信任后能打开页面,脚本依然失败。

第一反应是「服务端只发了叶证书,中间证书缺失导致链不完整」,验证下来不成立。

排查方向其实有限,先把可能性排一排。自建 CA 只装进系统信任库,requests 用的是 certifi 包内证书;没有设置 REQUESTS_CA_BUNDLE 指向企业根证书;容器里没有挂载 CA 文件,容器内信任库是空的。

先看脚本实际加载的证书包路径

python -c "import certifi;print(certifi.where())"

指定企业根证书让请求链走它

$env:REQUESTS_CA_BUNDLE='C:\certs\corp-ca.pem'

然后用 openssl 检查证书链是否完整

openssl s_client -connect gw.internal:443 -CAfile corp-ca.pem -showcerts

发起一次真实请求确认状态码

python -c "import requests;print(requests.get('https://gw.internal/v1/models',timeout=5).status_code)"

这类问题以前遇到过,但这次的触发条件和上次不一样。

改完先别撤,确认这几项。请求返回 200 且没有 SSL 告警,openssl 输出 Verify return code 为 0,服务端返回的证书链里包含中间证书。

这里还有个坑。别用 verify=False 绕过,那只是关掉校验,之后证书过期和域名不符都发现不了。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189