Nginx 作为 TLS 客户端与后端建立 mTLS 需协同配置 proxy_ssl_certificate、proxy_ssl_certificate_key、proxy_ssl_trusted_certificate 和 proxy_ssl_verify 等指令,并确保上游服务启用客户端证书校验。

要在 Nginx 作为反向代理时,与后端服务(如上游应用服务器)建立双向 TLS(mTLS)连接,关键不是仅靠 proxy_ssl_certificate 单独实现,而是需配合 proxy_ssl_certificate_key、proxy_ssl_trusted_certificate 和 proxy_ssl_verify 等指令协同配置。Nginx 在 upstream 连接中不直接“开启双向认证”,而是通过提供客户端证书(给上游)、验证上游证书(可选)、并强制证书校验来达成 mTLS 效果。
明确角色与前提条件
Nginx 在此场景中是 TLS 客户端(即“上游连接的发起方”),后端服务(如 Spring Boot、Envoy 或自建 HTTPS 服务)是 TLS 服务端。要完成双向认证:
- 你必须拥有:Nginx 使用的客户端证书(含私钥)+ 上游服务信任的 CA 根证书(用于验证上游证书)
- 上游服务必须已配置为要求客户端证书,并信任 Nginx 所用证书的签发 CA
- Nginx 版本需 ≥ 1.7.0(
proxy_ssl_*系列指令自该版本起支持),推荐使用 1.20+ 或最新稳定版 - 确保上游服务监听的是 HTTPS 端口(如 8443),且启用 client certificate required
核心 proxy_ssl 指令配置
在 upstream 块或 location 内的 proxy_pass 上下文中设置以下参数:
-
proxy_ssl_certificate:指定 Nginx 向上游出示的客户端证书路径(PEM 格式,含完整证书链,不含私钥) -
proxy_ssl_certificate_key:指定对应私钥文件路径(PEM 格式,权限建议设为600) -
proxy_ssl_trusted_certificate:指定用于验证上游服务器证书的 CA 根证书(或中间 CA)文件(PEM 格式) -
proxy_ssl_verify:设为on才会真正校验上游证书;若设为off,则跳过验证,失去身份确认能力 -
proxy_ssl_verify_depth:指定证书链验证深度(默认 1,通常无需修改) -
proxy_ssl_protocols:显式限定 TLS 版本,例如TLSv1.2 TLSv1.3(避免使用已弃用的 SSLv3/TLSv1.0)
典型配置示例
假设:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 客户端证书路径:
/etc/nginx/ssl/client.crt - 私钥路径:
/etc/nginx/ssl/client.key - 上游 CA 根证书:
/etc/nginx/ssl/upstream-ca.pem - 上游服务地址:
https://backend:8443
配置片段如下:
upstream backend_api {
server backend:8443;
}
server {
listen 443 ssl;
server_name api.example.com;
location / {
proxy_pass https://backend_api;
proxy_ssl_certificate /etc/nginx/ssl/client.crt;
proxy_ssl_certificate_key /etc/nginx/ssl/client.key;
proxy_ssl_trusted_certificate /etc/nginx/ssl/upstream-ca.pem;
proxy_ssl_verify on;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_ssl_server_name on; <!-- 启用 SNI,必要时 -->
}
}
验证与排错要点
配置完成后需验证是否真正生效:
- 检查 Nginx 配置语法:
nginx -t,确认无误后重载:nginx -s reload - 查看错误日志(
error_log):常见失败原因包括证书路径错误、私钥权限不对、CA 文件不包含正确根证书、上游未启用 client auth - 用
openssl s_client -connect backend:8443 -cert client.crt -key client.key -CAfile upstream-ca.pem手动模拟连接,确认能成功握手 - 上游服务日志应记录“client certificate received”或类似信息;若被拒绝,通常是 CA 不匹配或证书过期
-
proxy_ssl_server_name on在多数现代后端(尤其多租户或 SNI 路由场景)下建议启用,确保发送正确的 Server Name

















