必须配齐 proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name 和 proxy_ssl_server_name 四个指令并置于 location 或 upstream 块内,且 trusted_certificate 必须为后端自签根证书 PEM 文件,proxy_ssl_name 需与证书中 DNS SAN 完全一致,才能强制校验成功。

要让 Nginx 强制校验后端集群的自签名证书,关键不是只写 proxy_ssl_verify on,而是构建一个可信任、可验证、不绕过的 TLS 验证闭环。自签证书本身不被系统默认信任,必须显式告诉 Nginx “谁签的它、该信谁”,并确保所有校验环节都对齐。
必须配齐的四个核心指令
这四项缺一不可,且必须全部写在 location 或 upstream 块内(不能放在 http 或 server 块中):
-
proxy_ssl_verify on;—— 明确启用上游证书校验(默认是off,不设即跳过) -
proxy_ssl_trusted_certificate /etc/nginx/ssl/backend-ca.pem;—— 指向你后端服务自己的自签名根证书(PEM 格式),不是它的终端证书,也不是 fullchain -
proxy_ssl_name "svc-a.internal";—— 显式声明期望匹配的域名,必须与后端证书中的DNS:SAN 条目完全一致(例如证书含DNS:svc-a.internal,这里就写"svc-a.internal") -
proxy_ssl_server_name on;—— 启用 SNI,确保 Nginx 握手时发送该域名,避免后端返回默认或错误证书
自签名证书文件的正确准备方式
这个文件是整个验证的信任锚点,必须严格满足以下条件:
- 内容仅为 PEM 格式的自签名根证书(即后端服务生成时用
openssl req -x509得到的那个.crt文件) - 不能混入私钥、不能包含后端的 server.crt、不能有注释或空行
- 推荐路径:
/etc/nginx/ssl/backend-ca.pem,权限设为644,确保 nginx worker 进程(如www-data或nginx用户)可读 - 验证命令:
openssl x509 -in /etc/nginx/ssl/backend-ca.pem -text -noout应能正常输出证书信息
适配自签场景的关键补充项
自签证书链通常只有 1 层(自己签自己),但验证逻辑仍需微调:
-
proxy_ssl_verify_depth 1;—— 默认就是 1,符合自签结构;设得过大反而可能引入风险 -
proxy_ssl_session_reuse off;—— 关闭连接复用,防止异常证书状态被缓存复用 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 禁用老旧协议,避免握手阶段被降级绕过校验
常见失败原因与快速确认点
启用后若返回 502 或日志报 certificate verify failed,优先检查:
- 后端证书是否真为自签:运行
openssl x509 -in backend.crt -text -noout | grep "CA:TRUE",若输出CA:TRUE且Issuer == Subject,才是合格自签根 -
proxy_ssl_trusted_certificate是否指向了这个自签根证书,而不是后端的server.crt -
proxy_ssl_name是否与证书中Subject Alternative Name的 DNS 条目一字不差(大小写、点号、结尾斜杠都不能错) - Nginx 进程能否读取该证书文件:
sudo -u www-data cat /etc/nginx/ssl/backend-ca.pem应无权限拒绝


















