nginx 不在运行时验证证书有效性,需外部用 openssl 检查:确认实际加载的证书路径、检查有效期与吊销状态、验证证书链完整性及证书与私钥匹配性。

不能直接在 Nginx 进程内“实时检查”已加载证书的有效性——Nginx 启动或 reload 时只做基础校验(如 PEM 格式、私钥匹配),不验证过期、吊销或链完整性。真正有效的检查,必须绕过 Nginx 进程,从外部读取其实际使用的证书文件,并用 OpenSSL 主动验证。
确认 Nginx 实际加载的是哪个证书文件
别只信配置里的路径,得验证它真在读哪个文件:
- 查配置中
ssl_certificate指向的路径,例如:/etc/nginx/ssl/example.com.pem - 进入容器或服务器,运行:
ls -l /etc/nginx/ssl/example.com.pem,看修改时间是否匹配你更新的时间 - 全局搜索避免遗漏:
grep -r "ssl_certificate" /etc/nginx/,尤其注意include引入的子配置
检查证书本身是否有效且未过期
用 OpenSSL 直接解析该文件,获取关键信息:
- 查看有效期:
openssl x509 -in /etc/nginx/ssl/example.com.pem -noout -dates - 快速判断是否将在 30 天内过期:
openssl x509 -in /etc/nginx/ssl/example.com.pem -checkend 2592000(返回 0 表示安全) - 检查证书是否由可信 CA 签发(非自签):
openssl x509 -in /etc/nginx/ssl/example.com.pem -noout -issuer,对比是否含知名根 CA 名称(如 Let's Encrypt、DigiCert)
验证证书链完整性与客户端信任度
Nginx 不验证链是否完整,但浏览器会报错。需主动模拟客户端行为:
- 远程连接并打印整条链:
echo | openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null,确认输出中至少包含两段BEGIN CERTIFICATE(服务器证书 + 中间证书) - 本地验证链能否回溯到系统信任根:
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt /etc/nginx/ssl/example.com.pem,返回OK才算完整 - 若失败,说明中间证书缺失——需将中间证书追加到
example.com.pem末尾,形成fullchain.pem,并在 Nginx 配置中改用该文件
校验证书与私钥是否真正匹配
不匹配会导致 TLS 握手失败,Nginx 日志可能只显示模糊错误:
- 提取证书公钥模数:
openssl x509 -noout -modulus -in /etc/nginx/ssl/example.com.pem | md5sum - 提取私钥模数:
openssl rsa -noout -modulus -in /etc/nginx/ssl/example.com.key | md5sum - 两个 MD5 值必须完全一致,否则证书和私钥不是一对











