nginx 实现 mtls 的关键是配置可信 ca 并强制校验客户端证书:需准备 pem 格式 ca 公钥文件,设置 ssl_client_certificate 和 ssl_verify_client on,正确配置权限与路径,并透传 $ssl_client_verify、$ssl_client_s_dn 等变量至后端。

要让 Nginx 支持基于 SSL 客户端证书的认证(即 mTLS),关键不是“给客户端配证书”,而是让 Nginx 信任某个 CA,并强制校验客户端是否持有该 CA 签发的有效证书。
准备可信的 CA 证书文件
这个文件是整个双向认证的信任锚点,必须是 PEM 格式、只含公钥、无私钥、无 BOM 或多余空格。常见组织方式:
- 单级自建 CA:直接用你用
openssl req -x509生成的根证书(ca.crt),文件里只有一段-----BEGIN CERTIFICATE----- - 两级 CA(推荐生产环境):把中间 CA 和根 CA 按签发顺序拼在一起,中间 CA 在前、根 CA 在后,保存为
ca-bundle.crt - 不要用 Let’s Encrypt 等公开 CA 的根证书——它们不签发客户端证书,无法用于此场景
配置 Nginx 启用客户端证书校验
在 server 块中添加以下指令,缺一不可:
-
ssl_certificate /path/to/server.crt;和ssl_certificate_key /path/to/server.key;:服务端自己的证书和私钥 -
ssl_client_certificate /etc/nginx/ssl/ca.crt;:指向上面准备好的 CA 公钥文件(绝对路径) -
ssl_verify_client on;:开启强制校验;调试时可用optional,但上线必须为on -
ssl_verify_depth 1;:通常设为 1 即可(表示最多验证一级签发者)
注意:仅设置 ssl_client_certificate 而不启用 ssl_verify_client on,等同于未配置。
确保文件权限与路径正确
Nginx worker 进程需要能读取所有证书文件:
- CA 文件、服务端证书和私钥建议放在
/etc/nginx/ssl/下 - 执行
chmod 644 /etc/nginx/ssl/ca.crt(公钥可读)、chmod 600 /etc/nginx/ssl/server.key(私钥仅属主可读) - 确认路径是绝对路径,且 Nginx 配置语法通过
nginx -t检查无误
向后端透传客户端身份信息
验证通过后,Nginx 会生成几个内置变量,可用于识别用户或做应用层判断:
-
$ssl_client_verify:值为SUCCESS、FAILED:reason或NONE -
$ssl_client_s_dn:客户端证书的 Subject,例如CN=alice,OU=api,O=example -
$ssl_client_cert:Base64 编码的完整证书内容(慎用,体积较大)
在 location 或 proxy_pass 区块中加入:
proxy_set_header X-Client-Verify $ssl_client_verify;<br>proxy_set_header X-Client-DN $ssl_client_s_dn;











