DST Root CA X3过期后Python WebSocket客户端连接API出现证书问题
问题原因及解决方案
可能的原因
- Python默认使用独立的证书信任体系,和Windows系统、Chrome浏览器的信任存储不互通。你修改系统证书存储的操作对Python程序无效,Python默认使用
certifi包提供的根证书列表,而非系统的信任证书。 - 你使用的websocket客户端库依赖的根证书列表未更新,仍包含过期的DST Root CA X3证书,或者未正确匹配Globalsign Root CA R1的信任链,导致证书验证失败。
- 部分旧版本的Python ssl模块在Windows下默认没有优先读取系统信任证书,即使你已经在系统中禁用了过期根证书,Python的ssl验证逻辑仍会走旧的信任链校验。
解决方法
方案1:更新相关依赖包
优先升级certifi根证书包和你使用的websocket客户端库,以websocket-client为例,执行以下命令:pip install --upgrade certifi websocket-client
升级完成后重启程序即可,新版本的certifi已经移除了过期的DST Root CA X3,且已收录有效的Globalsign Root CA R1根证书。
方案2:强制Python读取系统信任证书
在websocket连接时手动指定使用系统默认的ssl上下文,示例代码如下:
import ssl import websocket # 创建系统默认ssl上下文,会读取Windows系统的信任证书 context = ssl.create_default_context() # 连接时传入ssl上下文 ws = websocket.WebSocket() ws.connect("wss://你的API地址", sslopt={"context": context})
也可以在运行程序前设置系统环境变量SSL_CERT_FILE指向系统CA证书路径,无需修改代码即可生效。
方案3:手动指定有效根证书
如果上述方案无效,可以手动导出Chrome浏览器中保存的Globalsign Root CA R1证书(PEM格式),在连接时手动指定该证书路径:
import websocket ws = websocket.WebSocket() ws.connect("wss://你的API地址", sslopt={"ca_certs": "path/to/globalsign_r1.pem"})
方案4:临时测试方案(仅用于验证问题,禁止在生产环境使用)
可以临时关闭证书验证快速定位问题,如果关闭后可以连接,即可确认是证书信任问题:
import ssl import websocket ws = websocket.WebSocket() ws.connect("wss://你的API地址", sslopt={"cert_reqs": ssl.CERT_NONE})
验证完成后务必改回正常的证书验证逻辑,避免出现安全风险。
内容的提问来源于stack exchange,提问作者mattwatkins
相关产品推荐
相关产品推荐

