Nginx 严格校验后端 HTTPS 证书必须同时配置四项:proxy_ssl_verify on;proxy_ssl_trusted_certificate 指向可信 CA 证书;proxy_ssl_name 指定匹配域名;proxy_ssl_server_name on 启用 SNI,缺一不可。

要让 Nginx 对后端 HTTPS 服务器证书做严格校验,不能只写 proxy_ssl_verify on。它必须和另外三项指令配合生效,否则会静默失败或直接返回 502 错误。
必须同时配置的四个核心项
这四项缺一不可,且必须写在同一个 location 或 upstream 块中:
- proxy_ssl_verify on; —— 明确启用校验开关,默认是 off,不开启等于完全跳过验证
-
proxy_ssl_trusted_certificate /path/to/ca-bundle.crt; —— 指向 PEM 格式的可信 CA 证书文件,推荐用系统级证书包(如
/etc/ssl/certs/ca-certificates.crt),若后端用私有 CA,则需把其根证书内容追加进去 -
proxy_ssl_name "backend.example.com"; —— 显式声明期望匹配的域名,用于比对证书中的 SAN 字段;当
proxy_pass使用 IP、变量(如https://$host)或泛域名时,此项不可省略 - proxy_ssl_server_name on; —— 启用 TLS SNI 扩展,确保 Nginx 在握手阶段向后端发送正确的域名,对接云服务、多租户后端或泛域名证书时必需
提升校验稳定性和安全性的关键补充
仅配齐四项还不够,以下配置能避免常见失败并加固验证逻辑:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- proxy_ssl_verify_depth 3; —— 默认只验证 1 层(终端直连根 CA),但多数生产环境是三级链(终端 → 中间 CA → 根 CA),设为 3 更稳妥;值太小会报 “unable to get issuer certificate”,太大则削弱安全性
- proxy_ssl_protocols TLSv1.2 TLSv1.3; —— 明确禁用 TLSv1.0 和 TLSv1.1,防止协议降级干扰证书校验
- proxy_ssl_session_reuse off; —— 关闭 TLS session 复用,避免缓存异常证书状态导致后续请求绕过重校验
证书文件与权限注意事项
proxy_ssl_trusted_certificate 所指文件必须满足:
- 路径正确,Nginx worker 进程(如
nginx用户)有读取权限(建议644) - 纯 PEM 格式,每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 只含根 CA 和中间 CA 证书,不能混入私钥、终端证书或
fullchain.pem中的服务证书 - 可用命令快速验证:
openssl pkcs7 -print_certs -in /path/to/file.crt -noout能正常输出即为合法
验证是否真正生效的方法
配置重载后,不能只看 Nginx 启动成功,需实测:
- 发起请求,观察响应状态码;若仍返回 502 或日志出现
certificate verify failed,重点排查证书链、域名匹配和 SNI 是否启用 - 查 Nginx error log:出现
SSL_do_handshake() failed后跟unable to get local issuer certificate,大概率是证书链不全或proxy_ssl_verify_depth不足 - 用 OpenSSL 手动测试后端链完整性:
openssl s_client -connect backend.example.com:443 -servername backend.example.com,确认返回的证书块数量是否 ≥2










