最可靠方式是用openssl s_client在Nginx本地实测证书链:只出现1次BEGIN CERTIFICATE表示链不完整,2次及以上说明含域名证书和中间证书;需确认ssl_certificate文件中域名证书在前、中间证书紧随其后、无空行或私钥;在线工具仅作辅助,最终以s_client结果为准。

最可靠的方式是在 Nginx 服务器本地用 openssl s_client 模拟真实客户端连接,直接查看它实际发送的证书链——这决定了安卓、Python requests、微信小程序等严格校验场景能否建立信任。
用 OpenSSL 命令实测 Nginx 返回的证书链
在服务器终端执行:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null
重点观察输出中 -----BEGIN CERTIFICATE----- 出现的次数和顺序:
- 只出现 1 次 → 仅返回了域名证书,中间证书缺失,链不完整
- 出现 2 次或以上 → 第一个是你的域名证书,后续是中间证书(如 Let’s Encrypt R3),说明链已发出
- 加过滤快速核对签发关系:
openssl s_client -connect your-domain.com:443 -showcerts 2>/dev/null | grep "subject\|issuer",第一段subject应含你的域名,第二段issuer应与之匹配
检查 Nginx 配置中 ssl_certificate 文件内容
Nginx 不会自动补全链,它只原样发送你指定的 PEM 文件。必须打开该文件人工确认:
- 开头必须是你自己的域名证书(
subject=CN=your-domain.com) - 紧接着是中间证书(不能是根证书)
- 每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 两段之间不能有空行,也不能混入私钥、注释或 root.crt
用在线工具交叉验证(辅助参考)
访问 SSL Checker 或 decoder.link,输入域名后重点关注:
- Certificate Chain 是否显示 “OK”
- Chain issues 是否提示 “Incomplete” 或 “Extra certs”
- 列出的层级是否为:Domain → Intermediate →(Root,但不应由 Nginx 发送)
注意:在线工具可能自动补全链,掩盖真实问题,结果仅作辅助,最终以 s_client 实测为准。
验证敏感客户端是否真正修复
浏览器缓存可能掩盖证书链缺陷,需绕过缓存验证:
- 安卓 Chrome 中访问
chrome://net-internals/#hsts,删除对应域名的 HSTS 记录 - 使用无痕模式,或另一台未访问过该域名的安卓设备测试
- Python 脚本调用
requests.get("https://your-domain.com"),确认不再抛出CERTIFICATE_VERIFY_FAILED


















