Nginx可通过proxy_ssl_certificate等指令实现上游mTLS双向认证:需同时配置客户端证书/私钥、开启上游证书校验及指定可信CA,且上游服务必须强制要求并验证该客户端证书,否则退化为单向TLS。

要利用 proxy_ssl_certificate 实现反向代理的双向 TLS(mTLS)身份准入,核心在于:Nginx 作为反向代理时,不仅验证上游服务器的证书(服务端认证),还要向上游出示自己的客户端证书,并强制上游校验该证书(客户端认证),从而完成双向身份确认。
配置 upstream 的双向 TLS 连接
关键不是只设 proxy_ssl_certificate,而是配套启用客户端证书发送与服务端证书校验。需在 location 或 upstream 块中设置以下指令:
-
proxy_ssl_certificate /path/to/client.crt:指定 Nginx 向上游出示的证书(含公钥) -
proxy_ssl_certificate_key /path/to/client.key:对应私钥,必须安全保护(权限 600) -
proxy_ssl_verify on:开启对上游服务器证书的校验 -
proxy_ssl_trusted_certificate /path/to/upstream-ca.crt:提供上游 CA 证书,用于验证上游证书签名链 -
proxy_ssl_verify_depth 2:可选,设定证书链校验深度
确保上游服务要求并校验客户端证书
仅 Nginx 发送证书不够,上游服务(如后端 API、gRPC 服务或另一台 Nginx)必须配置为:要求 TLS 客户端证书,并使用你签发 client.crt 的 CA 根证书进行校验。例如:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 若上游是 Nginx,需配置
ssl_client_certificate和ssl_verify_client on - 若上游是 Envoy,需在
tls_context中启用require_client_certificate: true并加载对应 CA - 若上游是 Spring Boot + Tomcat,需配置
server.ssl.trust-store及client-auth: need
否则,上游会忽略 client certificate,mTLS 就退化为单向 TLS。
证书与密钥管理要点
安全性和可用性高度依赖证书生命周期管理:
- client.crt 应由专用内部 CA 签发,**不能复用服务器证书或自签名无信任链的证书**
- 私钥
client.key必须严格限制读取权限(chown root:nginx; chmod 600),避免泄露导致身份冒用 - 建议将 client.crt/client.key 放在非 web 可访问路径(如
/etc/nginx/ssl/client/) - 若上游有多套环境(dev/staging/prod),应为每套分配独立证书,便于按需吊销
调试与验证方法
配置完成后务必验证双向握手是否真实生效:
- 用
openssl s_client -connect upstream-host:port -cert client.crt -key client.key -CAfile upstream-ca.crt手动模拟,观察是否出现Verify return code: 0 (ok)且有Acceptable client certificate CA names - 检查 Nginx error log,确认无
SSL_do_handshake() failed或certificate verify failed - 在 upstream 日志中确认收到并接受客户端证书(如 Nginx upstream 会记录
$ssl_client_s_dn) - 临时将 upstream 配置为
ssl_verify_client optional_no_ca并打印$ssl_client_cert,可直观确认证书是否送达

















