验证Nginx HTTPS证书需分两步:一查有效期(用openssl x509 -in cert.pem -noout -dates看notAfter),二验链完整性(用openssl s_client -connect domain:443 -showcerts看证书段数并确认fullchain.pem含域名证+中间证),缺一不可。

验证 Nginx 中 HTTPS 证书的有效期和完整性,不能只依赖浏览器“挂锁”或服务启动不报错——Nginx 启动时只校验私钥与证书匹配性,既不检查链是否完整,也不预警过期时间。真正有效的验证必须分两步:查有效期、验链完整性,且都要在服务端本地实操。
一、快速查看证书有效期(精准、免重启)
直接读取证书文件,无需访问线上域名,结果最可靠:
-
Linux 环境:运行命令(替换为你的真实路径)
openssl x509 -in /etc/nginx/ssl/server.pem -noout -dates
输出中notAfter即为过期时间,例如notAfter=Jul 15 12:00:00 2026 GMT -
Windows 环境:打开 CMD,执行
openssl x509 -in "E:\Software\1111\server.pem" -noout -dates - 如需自动告警,可将
notAfter转为时间戳,与当前时间比对,提前 15 天触发邮件或 Prometheus 上报
二、验证证书链是否完整(关键防安卓/iOS/小程序失败)
Nginx 不会自动补全中间证书,它只原样发送你配置的 ssl_certificate 文件内容。链不全会导致严格客户端(如微信小程序、Python requests)直接拒绝连接。
- 用
openssl s_client在 Nginx 服务器上直连自己:openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null - 观察输出中
-----BEGIN CERTIFICATE-----出现次数:
仅 1 次 → 链不完整(缺中间证书);2 次及以上 → 正常(第 1 段是你的域名证书,后续是中间 CA) - 同时检查
ssl_certificate指向的 PEM 文件:
开头必须是你自己的证书(含CN=your-domain.com)
紧接着是中间证书(如 Let’s Encrypt R3),不能有空行、私钥或根证书
三、确认系统信任根是否能验证该链(避免“自签名”误判)
即使链完整,若中间 CA 不被系统信任,仍会验证失败。需主动用系统信任库验证:
- 运行:
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt /path/to/fullchain.pem - 返回
OK表示整条链可回溯到系统可信根;
若报unable to get issuer certificate,说明中间证书缺失、顺序错误,或系统 CA 包未更新 - 注意:
ssl_certificate必须指向包含“域名证书 + 中间证书”的fullchain.pem,不能只放cert.pem
四、排查常见静默失效点
很多问题看似正常,实则链已断裂,只是浏览器缓存或宽松校验掩盖了问题:
- 不要只信在线 SSL 检测工具——它们常自动补全链,给出“OK”假象
- 安卓 Chrome 需清除 HSTS 记录(访问
chrome://net-internals/#hsts删除域名)再测 - 用 Python 写一行脚本真实验证:
python3 -c "import requests; print(requests.get('https://your-domain.com').status_code)"
若抛CERTIFICATE_VERIFY_FAILED,就是链或有效期出问题


















