根证书本身不会失效,但客户端信任库移除根证书会导致其签发的证书链无法验证;nginx不校验可信性,只负责发送证书,排查重点是中间证书是否正确传递及客户端是否预置对应根证书。

根证书本身不会“失效”,但浏览器或系统信任库中移除某个根证书(比如 Let’s Encrypt 的 ISRG Root X1 被部分旧系统剔除),会导致其签发的整个证书链无法被验证。Nginx 本身不校验根证书是否可信,它只负责把证书发给客户端;真正出问题的是客户端找不到可信任的锚点。排查重点不是改 Nginx,而是确认它有没有把正确的中间证书传出去、客户端有没有对应根证书。
先看错误表现是否指向根证书缺失
出现以下提示时,才需怀疑根证书信任问题:
- SEC_ERROR_UNKNOWN_ISSUER(Firefox)
- CERTIFICATE_VERIFY_FAILED(Python requests、curl、Java)
- “证书颁发机构无效” 或 “无法验证服务器身份”(iOS/Android 原生 WebView)
注意:这些错误和 NET::ERR_CERT_DATE_INVALID(过期)、ERR_CERT_COMMON_NAME_INVALID(域名不匹配)性质不同,它们说明客户端认可证书格式和时间,但无法追溯到一个已知可信的根。
验证服务端实际发送的证书链
用 OpenSSL 直连,看 Nginx 到底发了什么:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | grep "subject="正常应输出至少两行:
- 第一行含
CN=your-domain.com(你的域名证书) - 第二行含
CN=Let's Encrypt R3或CN=DigiCert TLS RSA SHA256 2020 CA1(中间证书)
如果第二行是 CN=ISRG Root X1,说明你误把根证书塞进了 ssl_certificate 文件——Nginx 不该发根证书,客户端自己得有它。删掉 fullchain.pem 里的根证书段。
确认客户端环境是否缺少对应根证书
不是所有设备都预装最新根证书:
- 老旧 Android(
- 企业内网若使用私有 CA,客户端必须手动安装其根证书
- Java 应用默认用 JRE 自带 truststore,不随系统更新,需手动导入新根证书
解决方向分两类:
- 对公网用户:换用兼容性更广的 CA(如 DigiCert、Sectigo),或确保用双链方案(R3 + E1)覆盖更多旧系统
- 对企业/内网:向客户端分发并安装私有 CA 根证书,或在 Nginx 反向代理时用
proxy_ssl_trusted_certificate指定内部根证书(仅用于验证后端,不影响对外)
检查 Nginx 是否意外干扰了信任链
以下配置容易引发根证书相关误判:
-
ssl_trusted_certificate错误指向了站点证书或空文件 → 影响的是 Nginx 验证上游,和对外无关,但容易混淆排查方向 -
proxy_ssl_verify on启用后,proxy_ssl_trusted_certificate没配或路径错误 → 导致 Nginx 自己连不上后端,报错会误导为“证书问题” - CDN 或 WAF 缓存了旧证书链 → 即使 Nginx 已更新,用户仍看到老链,需在 CDN 控制台强制刷新 SSL 配置
验证方式:绕过 CDN,用 curl 直连 Nginx 服务器 IP + 端口,再运行上面的 OpenSSL 命令比对输出。











