Nginx中ssl_client_certificate配置中间CA实现多级证书验证,核心是提供含根CA与中间CA的PEM格式信任链(需CA:TRUE),并配合ssl_verify_client on、ssl_verify_depth 2及服务端证书等指令协同生效。

在 Nginx 中用 ssl_client_certificate 配置中间 CA 实现多级证书验证,核心是让服务端能正确构建并信任从客户端证书回溯到根 CA 的完整链路。Nginx 本身不强制要求证书链顺序,但必须提供所有必要的上级 CA 证书(含中间 CA),且这些证书必须是 PEM 格式、具备 CA 属性(CA:TRUE)。
中间 CA 证书的准备与合并
若客户端证书由中间 CA(如 Intermediate CA)签发,而该中间 CA 又由根 CA 签发,则 Nginx 需同时信任这两级:
- 中间 CA 证书必须包含 Basic Constraints: CA:TRUE,可用 openssl x509 -in intermediate.crt -text -noout | grep "CA:" 验证;
- 根 CA 和中间 CA 证书可合并为单个 PEM 文件(如 trusted-ca-bundle.pem),顺序不限(Nginx 会自动尝试路径匹配);
- 不要将客户端证书或服务端证书误放入该文件;也不能混入私钥或 DER/P12 格式内容。
关键配置项必须协同生效
ssl_client_certificate 单独设置无效,必须搭配以下指令才能启用多级校验:
- ssl_verify_client on:强制客户端提供证书并校验;
- ssl_verify_depth 2:显式允许最多 2 级证书链(客户端证书 → 中间 CA → 根 CA);默认值为 1,若不调高会导致中间 CA 签发的证书被拒绝;
- ssl_certificate 和 ssl_certificate_key:服务端自身 HTTPS 所需证书与私钥,必须已正确配置;
- 监听必须启用 SSL:listen 443 ssl。
验证与调试要点
多级验证失败时,Nginx 错误日志通常只显示泛化信息(如 SSL_do_handshake() failed),需结合客户端反馈判断:
- 返回 HTTP 400 或连接直接中断:客户端未发送证书,或证书格式错误(如非 PEM、含多余空格);
- 返回 HTTP 495 或 496:证书已提交但链路验证失败,常见于中间 CA 缺失、ssl_verify_depth 过小、或证书过期/吊销;
- 临时开启 debug 日志:error_log /var/log/nginx/error.log debug;,观察 handshake 阶段具体报错;
- 用 openssl s_client -connect host:443 -cert client.crt -key client.key -CAfile trusted-ca-bundle.pem 在服务端本地模拟握手,快速定位链路问题。
按路径精细化控制双向认证
若只需对特定接口(如 /api/private)启用多级校验,可将相关指令移入 location 块,并设为 optional:
- ssl_verify_client optional; 允许无证书请求通过;
- 后端通过 $ssl_client_verify 变量判断结果(值为 SUCCESS 或 FAILED);
- 同时透传证书信息:proxy_set_header X-Client-Verify $ssl_client_verify;、proxy_set_header X-Client-DN $ssl_client_s_dn;。











