为何一台机器触发SSLCertVerificationError(证书链含自签名证书)另一台正常?
解决跨机器的aiohttp SSLCertVerificationError问题
排查方向与解决方案
系统根证书不一致
两台机器的系统根证书库可能存在差异,正规SSL证书的颁发机构根证书在出错机器上未被信任。可以手动指定站点的完整证书链文件路径:# 创建ClientSession时指定证书文件 async with aiohttp.ClientSession(verify="/path/to/full-cert-chain.pem") as session: # 或在post请求中单独指定 async with session.post(url, data=data, verify="/path/to/full-cert-chain.pem") as response: x = await response.text()网络代理/防火墙拦截
出错机器可能通过代理访问,代理替换了SSL证书导致验证失败。可以显式禁用代理测试:# 创建不带代理的连接 connector = aiohttp.TCPConnector(ssl=False) # 仅测试用,生产环境慎用 async with aiohttp.ClientSession(connector=connector) as session: pass同时检查是否有防火墙对SSL流量做中间人拦截,临时关闭防火墙验证是否恢复正常。
aiohttp版本差异
两台机器的aiohttp版本不同,旧版本可能存在SSL验证逻辑bug。升级出错机器的aiohttp到最新稳定版:pip install --upgrade aiohttp服务器证书链不完整
若站点服务器返回的证书缺少中间证书,部分机器无法完成完整验证。从浏览器导出站点的完整证书链(包含中间证书),在代码中指定使用该文件。系统时间偏差
出错机器的系统时间与当前时间差过大,导致证书有效期验证失败。同步机器时间到网络时间服务器。
内容的提问来源于stack exchange,提问作者jaytate
相关产品推荐
相关产品推荐

