mod_wsgi中HTTPS调用9090端口遇本地证书验证失败问题求助
问题解答
结论:9090端口本身不是导致证书验证失败的原因。SSL证书验证逻辑不依赖端口,只和证书本身的有效性、信任链完整性以及域名匹配有关。
你遇到的SSL: CERTIFICATE_VERIFY_FAILED错误,核心原因是Python通过certifi提供的根证书库,无法验证myexample.com:9090返回的证书信任链,常见排查和解决方向如下:
1. 检查9090端口服务返回的证书链
用OpenSSL命令直接查看目标端口返回的证书详情:
openssl s_client -connect myexample.com:9090 -showcerts
重点看输出里的证书链部分:
- 是否包含完整的证书层级(叶子证书→中间证书→根CA证书)
- 有没有出现
unable to get local issuer certificate的提示,这通常说明服务器只返回了叶子证书,未提供中间证书,导致客户端无法完成信任链追溯。
2. 确认certifi根库是否信任证书的签发CA
certifi.where()指向的是Mozilla维护的公开根CA库,如果myexample.com:9090的证书是由私有CA、内部CA或certifi未收录的小众CA签发的,就会验证失败。
- 可以将该CA的根证书(或完整证书链)添加到certifi的信任目录,或者在创建SSL上下文时直接指定包含该CA证书的文件:
context = ssl.create_default_context(cafile="/path/to/your/ca-cert.pem") req = urlopen(url, context=context)
3. 验证证书的域名匹配性
虽然不涉及端口,但要确认证书的**主题备用名称(SAN)或通用名称(CN)**是否包含myexample.com(证书验证不检查端口,只校验域名)。如果证书绑定的是其他域名,也会触发验证失败。
4. 排查服务器端证书配置问题
确保9090端口的服务(比如Nginx、Apache等)配置了完整的证书链文件,而不仅仅是叶子证书。大多数Web服务器需要将叶子证书和所有中间证书合并到一个文件中,才能正确返回完整的信任链给客户端。
不推荐的临时方案的问题
你使用的ssl._create_unverified_context()会完全跳过SSL证书验证,存在中间人攻击风险,且部分场景下失败可能是因为其他网络问题(比如代理、防火墙拦截),无法从根本上解决证书信任问题。
内容的提问来源于stack exchange,提问作者peter
相关产品推荐
相关产品推荐

