最直接有效的方式是用 openssl s_client 命令远程连接目标 nginx 服务器并显示全部证书内容,通过统计 begin certificate 出现次数判断链完整性:1次为缺失中间证书,2次为正常,3次及以上需检查是否误含根证书;再用 grep 过滤 subject/issuer 验证签发关系;最后用 openssl verify 结合系统 ca 文件验证信任链是否可达可信根。

最直接有效的方式是用 openssl s_client 命令远程连接目标 Nginx 服务器,强制显示全部证书内容。它不依赖浏览器、不经过 CDN 缓存,能真实反映客户端收到的证书序列。
核心命令(一键执行)
在任意有 OpenSSL 的 Linux/macOS 终端中运行:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null
把 your-domain.com 替换成你的实际域名。执行后会输出所有证书块,每段以 -----BEGIN CERTIFICATE----- 开头,-----END CERTIFICATE----- 结尾。
快速判断链是否完整
观察输出中 -----BEGIN CERTIFICATE----- 出现次数:
- 只出现 1 次 → 仅发了域名证书,中间证书缺失
- 出现 2 次 → 正常:第 1 段是你的域名证书,第 2 段是中间证书(如 Let’s Encrypt R3)
- 出现 3 次及以上 → 需检查:第 3 段是否为根证书(如 ISRG Root X1)。Nginx 不该发送根证书,否则属于冗余或拼接错误
验证顺序与签发关系
加一行过滤,快速核对两段证书的逻辑关系:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | grep "subject\|issuer"
结果应类似:
- 第一段:
subject=CN=your-domain.com(你的域名) - 第二段:
issuer=CN=Let's Encrypt R3(与上一段的subject匹配) - 第二段的
subject应为CN=Let's Encrypt R3,表示它就是中间证书
补充:确认证书是否被系统信任
如果链看起来完整但仍有校验失败,可进一步用本地信任库验证:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt -
返回 OK 表示整条链能回溯到系统可信根;若报 unable to get issuer certificate,说明中间证书未正确提供或顺序错乱。











