核心是确认Nginx是否发送完整且顺序正确的证书链(域名证书+中间证书,不含根证书),最准验证方式是用openssl s_client -connect domain:443 -showcerts检查输出中BEGIN CERTIFICATE块数量与顺序:仅1块说明缺失,≥2块且首块为域名证书、次块issuer匹配首块subject、末块非根证书才合规;需确保ssl_certificate指向手动拼接的fullchain.pem(cat domain.crt intermediate.crt > fullchain.pem),并重载Nginx。

排查 Nginx 访问时提示“证书链不完整”或“不受信任”,核心是确认 Nginx 是否在 TLS 握手时向客户端发送了**完整的、顺序正确的证书链**(域名证书 + 中间证书),且不含根证书。问题不在浏览器,而在 Nginx 实际发出的内容是否满足严格客户端(如安卓、curl、Java 程序)的验证要求。
用 OpenSSL 检查 Nginx 实际发送的证书链
这是最直接、最可靠的验证方式,模拟真实客户端视角:
- 运行命令:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null - 观察输出中
-----BEGIN CERTIFICATE-----出现几次:只出现 1 次 → 链缺失;出现 2 次或以上 → 链已发送 - 第一段必须是你域名的证书(
subject=CN=your-domain.com);第二段起应为中间证书,其issuer要与上一段的subject匹配 - 末尾不能出现根证书(如 ISRG Root X1),也不能有空行、私钥或乱码
核对证书文件内容和拼接逻辑
Nginx 不会自动补全链,它只原样发送 ssl_certificate 指向的 PEM 文件:
- 打开该文件(如
/etc/nginx/ssl/fullchain.pem),确认开头是你的域名证书,紧接着是中间证书(如 Let’s Encrypt 的 R3) - 正确拼接方式:
cat domain.crt intermediate.crt > fullchain.pem(顺序不可颠倒) - 常见错误:把
ca-bundle.crt或root.crt也加进去;混入私钥;两段证书之间有空行或 BOM 字符 - 验证拼接结果:
grep -c "BEGIN CERTIFICATE" fullchain.pem应返回 ≥2
检查 Nginx 配置是否指向正确文件
配置写错是高频原因:
-
ssl_certificate必须指向你拼好的fullchain.pem,不是单独的cert.pem或domain.crt -
ssl_certificate_key仍用原始私钥文件(权限建议600) - 删掉或注释掉旧配置,避免残留干扰
- 执行
nginx -t确认语法无误,再systemctl reload nginx
交叉验证与客户端清理
避免缓存干扰判断:
- 用 SSL Labs 或 Decoder.link 输入域名,看 “Certificate Chain” 是否标为 OK,重点关注安卓列是否绿色
- 安卓端需清除 HSTS 缓存:访问
chrome://net-internals/#hsts删除对应域名记录 - 测试时优先用无痕模式、新设备或终端命令:
curl -v https://your-domain.com观察 TLS 握手细节 - 不要依赖
curl -k,它跳过验证,无法反映真实问题


















