验证nginx ssl证书链完整性与有效性需三步:一查有效期(openssl x509 -in fullchain.pem -noout -dates看notafter),二验链完整性(openssl s_client -connect domain:443 -showcerts看begin certificate段数≥2),三测系统信任(openssl verify -cafile ca-certificates.crt fullchain.pem返回ok)。

验证 Nginx 中 SSL 证书链的完整性与有效性,不能只看配置是否写对、服务能否启动,更不能依赖浏览器“小锁图标”——很多问题(如微信小程序白屏、安卓 App 连接失败、Python requests 报 SSLError)都源于证书链不完整或已过期,而 Nginx 启动时完全不检查这些。
一、查证书有效期:直接读文件,最准最快
证书过期是硬性失效,必须提前发现。Nginx 不会主动提醒,需人工或脚本检查:
- 运行命令(替换为你的真实路径):
openssl x509 -in /etc/nginx/ssl/fullchain.pem -noout -dates - 重点关注
notAfter字段,例如notAfter=Jul 15 12:00:00 2026 GMT—— 当前时间(2026年8月20日)已超此日期,证书即失效 - 若用 Let’s Encrypt,通常有效期为 90 天,建议在到期前 15 天自动告警
二、验证书链是否完整:关键看 Nginx 实际发了什么
Nginx 只原样发送 ssl_certificate 指向的 PEM 文件内容,不会自动补中间证书。链不全,严格客户端(iOS、小程序、curl -v、requests)就会拒连。
- 在 Nginx 服务器上执行:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null - 观察输出中
-----BEGIN CERTIFICATE-----出现次数:
仅 1 次 → 链缺失(只发了域名证书);
2 次或以上 → 正常(第 1 段是你的证书,后续是中间 CA,如 R3 或 G2) - 同时打开
fullchain.pem文件确认:
第一段必须是你的域名证书(含CN=your-domain.com);
紧接着是中间证书(如 Let’s Encrypt R3),不能是根证书;
两段之间无空行、无私钥、无注释
三、测整条链是否可被系统信任:避免“证书对但不认”
即使链完整,若中间 CA 不在系统信任库中,仍会验证失败(尤其内网自签或私有 CA 场景)。
- 运行:
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt /etc/nginx/ssl/fullchain.pem - 返回
OK表示该链能成功回溯到系统可信根;
若报unable to get issuer certificate,说明中间证书缺失、顺序错,或系统 CA 包未更新 - 注意:
ssl_certificate必须指向fullchain.pem(域名证 + 中间证),不是单独的cert.pem
四、验证 Nginx 是否真正把链送出去:绕过缓存实测
浏览器可能缓存旧链或跳过部分校验,需用命令直连确认握手行为。
- 执行:
openssl s_client -connect your-domain.com:443 -servername your-domain.com - 重点看三处:
Verify return code: 0 (ok)→ 本地 OpenSSL 认可该链;subject=CN=your-domain.com→ 域名匹配;issuer=后应与中间证书的subject对得上 - 若返回码非 0,或 issuer 明显不匹配,说明链断裂或顺序错误











