nginx本身不校验证书指纹,仅加载证书;需通过openssl命令本地验证证书文件指纹、线上确认实际加载指纹,或在openresty中用lua实现上游证书指纹校验。

在 Nginx 中本身不直接提供“验证 SSL 证书指纹”的运行时功能,因为 Nginx 是服务器端,它负责加载和使用证书,而不是像客户端那样去校验远端证书指纹。但你可以通过以下两种常见场景来实现“验证 SSL 证书指纹”的目的:
一、验证你即将部署到 Nginx 的证书文件是否正确(本地验证)
这是最常用的需求:确保你准备给 Nginx 配置的 ssl_certificate 文件(如 fullchain.pem)和私钥配对,且其公钥指纹与预期一致(比如从 CA 获取的指纹、或之前备份的指纹)。
- 查看证书 SHA-256 指纹(推荐,更安全):
openssl x509 -in fullchain.pem -noout -fingerprint -sha256 - 查看 SHA-1 指纹(兼容旧系统,但不推荐用于新验证):
openssl x509 -in fullchain.pem -noout -fingerprint -sha1 - 若需比对证书链中**叶证书**(即你的域名证书,非中间证书),可先分离:
openssl x509 -in fullchain.pem -noout -text | head -20确认第一块是你的证书,再用sed或awk提取并单独计算指纹
二、Nginx 作为反向代理时,验证上游 HTTPS 服务的证书指纹(客户端校验)
Nginx 可以作为 HTTPS 客户端(例如用 proxy_pass https://...),此时它会连接上游服务。默认它只校验证书域名和有效期,不校验证书指纹。但可通过以下方式增强校验:
- 使用
proxy_ssl_trusted_certificate指定受信任的 CA 证书包,并开启proxy_ssl_verify on—— 这能验证签名链,但不是指纹级 - 若必须做指纹锁定(如对接固定后端、防中间人),Nginx 原生不支持指纹白名单;需改用 OpenResty + Lua,在
ssl_certificate_by_lua_block中调用ssl.server_name()和ssl.raw_server_cert()解析证书并计算指纹比对 - 更轻量的替代方案:用
proxy_ssl_verify_depth 2+ 自建 CA 签发上游证书,将该 CA 加入proxy_ssl_trusted_certificate,效果接近指纹控制,且更符合 PKI 实践
三、上线前快速确认 Nginx 实际加载的证书指纹(线上验证)
避免配置错误导致 Nginx 加载了旧证书或错误路径的文件:
- 重启 Nginx 后,用 OpenSSL 直连你的服务端口获取实时证书:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -fingerprint -sha256 - 注意加
-servername(SNI)参数,否则可能拿到默认虚拟主机的证书 - 对比该输出与你本地
fullchain.pem的指纹,一致说明加载正确
不复杂但容易忽略:Nginx 不缓存证书文件内容,每次 reload 都重新读取磁盘。所以只要文件更新、配置指向正确、语法检查通过(nginx -t),指纹就取决于你磁盘上的 PEM 文件本身。











