Windows 上 Codex 突然 stream disconnected,网页还能聊

Windows 上 Codex CLI 用着好好的,某天敲完提示词就断:

stream disconnected before completion:
error sending request for url
(https://chatgpt.com/backend-api/codex/responses)

网页 ChatGPT 还能聊,订阅页也看不到欠费。第一反应多半是额度用完了、账号被踢了或者代理又不稳。但在不少机器上,真正的原因是 Schannel 不认证书链,跟额度没关系。

桌面版有时更让人摸不着头脑:界面只刷 Reconnecting... waiting for network,不显示证书错误。CLI 至少还能在日志/报错里带上那个 backend-api/codex/responses URL。不管哪边,先别急着换号。

用 curl 对一下

PowerShell 里跑:

curl.exe -Iv https://chatgpt.com

如果看到:

schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)
The certificate chain was issued by an authority that is not trusted.

基本可以确定是本机 HTTPS 证书校验失败了。443 端口可能还是通的,Test-NetConnection chatgpt.com -Port 443 显示 TcpTestSucceeded : True 也常见。浏览器照样打开 chatgpt.com,因为 Chrome/Edge 自己的证书更新路径,经常和命令行用的系统 Root 库不同步。Codex(以及很多 Windows 版 curl)走 Schannel 时,握手失败就只报一句含糊的 stream disconnected。GitHub 上 Windows 相关 issue 里,复现路径就是:TCP 通、浏览器通、curl.exe -Iv 报 SEC_E_UNTRUSTED_ROOT,Codex 却只重连。

再顺手看一眼环境变量。有人给终端塞过临时的 SSL_CERT_FILE,文件删了变量还在,或者 PEM 只剩半截。Codex 会优先读 CODEX_CA_CERTIFICATE,没有才回退 SSL_CERT_FILE。bundle 指错了,浏览器用的是系统库所以没事,只有 CLI 出错。

系统根证书缺了或停更了

长期没打补丁、精简镜像、装机包裁过证书存储,Root 库会缺 CA,验 chatgpt.com(常见 Let’s Encrypt 一类链)就会失败。个人电脑上常见的做法是用管理员 CMD / PowerShell 从 Windows Update 拉当前受信任根集合,再写进本机 Root:

certutil -generateSSTFromWU roots.sst
certutil -addstore -f Root roots.sst

做完关掉终端重开(旧进程可能还缓存着之前的信任状态),再跑 curl.exe -Iv https://chatgpt.com。握手正常了再开 Codex。这两条是 Windows 自带 certutil 的能力,不是第三方脚本。

公司机还要看组策略有没有关掉根证书自动更新:

reg query "HKLM\SOFTWARE\Policies\Microsoft\SystemCertificates\AuthRoot" /v DisableRootAutoUpdate

值为 1 时,系统不会自动补根。有人在获准改策略后把该项改回 0,并执行:

certutil -setreg chain\ChainCacheResyncFiletime "@now"

再重启,SEC_E_UNTRUSTED_ROOT 消失,Desktop 重连循环也停了。键在 HKLM\SOFTWARE\Policies 下,域管机器改完可能被 GPO 刷回去,这种情况得找 IT,别自己反复改。

公司网在做 TLS 解密时

出口挂着企业代理 / MITM 网关时,叶子证书往往由公司私有根签发。官方认证文档写明:把公司根 CA 的 PEM 指给 Codex,CODEX_CA_CERTIFICATE 优先,未设则用 SSL_CERT_FILE;同一套对登录、普通 HTTPS、安全 WebSocket 都生效。环境变量页也是这个优先级。PowerShell 示例:

$env:CODEX_CA_CERTIFICATE="C:\certs\corp-root.pem"
codex

PEM 跟 IT 要可核验的那份,别用网上来路不明的根证书。修完用 curl 对照:系统信任修好后,不带自定义 CA 的 curl.exe -Iv https://chatgpt.com 应能完成 TLS;若只有走公司解密的链路才通,就确认 Codex 启动的那个会话里 CA 变量还在。

跟额度、登录失败怎么分开看

额度不够、工作区没席位,通常会在登录或权限提示里说清楚。token_exchange_failed 那类是 OAuth 换票阶段的事,另开帖写过,这里不重复。这帖说的是另一种情况:已经能进对话,请求打到 chatgpt.com/backend-api/codex/responses 时断流,而且 curl 在证书这一层就失败,这时先修信任链。代理节点不稳也会断,但证书都过不去的话,先修 Schannel 再查线路。

修好后建议确认两件事:curl.exe -Iv https://chatgpt.com 能完成 TLS;新开一轮 Codex 对话不再秒断。还挂的话把 curl 完整输出、DisableRootAutoUpdate 查询结果、是否设置了 CODEX_CA_CERTIFICATE/SSL_CERT_FILE 贴出来,方便大家帮你看。

参考: