ssl_client_certificate是nginx信任客户端证书签发者的锚点,必须与ssl_verify_client on配套使用,指定pem格式的根/中间ca证书(不含私钥),配合ssl_verify_depth设置链深度,并通过proxy_set_header透传验证结果至后端。

要为企业级核心 API 网关启用 HTTPS 双向认证,ssl_client_certificate 不是孤立开关,而是信任锚点的声明——它告诉 Nginx “哪些 CA 有权签发合法客户端证书”。仅配它不生效,必须与 ssl_verify_client on 配套,且证书链、权限、格式缺一不可。
明确 ssl_client_certificate 的真实作用
这个指令指定的是受信任的根或中间 CA 证书文件(PEM 格式),不是客户端证书,也不是服务端证书。Nginx 用它来验证客户端提交的证书是否由你认可的 CA 签发。关键点:
- 文件必须只含公钥证书(以
-----BEGIN CERTIFICATE-----开头),不能含私钥、不能有注释、不能混入客户端证书 - 若使用多级 CA(如根 CA + 中间 CA),需将它们合并进同一个 PEM 文件,每张证书之间空一行
- 路径必须为绝对路径,且 Nginx worker 进程(如 www-data)要有读取权限:
chmod 644 /path/to/ca-bundle.crt - 不能复用服务端证书文件(
ssl_certificate),二者语义和用途完全不同
强制开启双向认证的最小必要配置
在 server 块中,以下三行构成生产环境最低可行配置:
-
ssl_client_certificate /etc/nginx/ssl/client-ca.pem;—— 指向你私有 PKI 的根/中间 CA 证书 -
ssl_verify_client on;—— 强制客户端提供证书,缺失或无效即拒连(TLS 握手失败或 HTTP 400) -
ssl_verify_depth 2;—— 明确证书链验证深度(例如:客户端证书 → 中间 CA → 根 CA)
漏掉任意一项都会导致认证失效:没配 ssl_client_certificate 会报 "No required SSL certificate was sent";设成 optional 则形同未启用;ssl_verify_depth 过小会导致链验证中断。
让后端真正拿到可信身份信息
Nginx 完成证书验证后,需把结果透传给上游 API 服务,否则鉴权逻辑无法落地:
- 用
proxy_set_header X-Client-DN $ssl_client_s_dn;传递客户端证书 subject(如CN=svc-payment-prod,OU=Services,O=Acme) - 用
proxy_set_header X-Client-Verify $ssl_client_verify;传递验证状态(SUCCESS或FAILED) - 如需二次校验指纹或 SPIFFE ID,可加
proxy_set_header X-Client-Cert $ssl_client_cert;(Base64 编码 PEM) - 务必在
location块内设置,避免静态资源也被透传无关头
配套企业级安全闭环
仅完成握手验证远远不够,还需叠加运行时管控:
-
OCSP Stapling:启用
ssl_stapling on; ssl_stapling_verify on;,实时检查证书吊销状态,避免 CRL 延迟风险 -
动态访问控制:用
map指令解析$ssl_client_s_dn,按 OU、CN 或 URI SAN 匹配预设角色组,再结合allow/deny或传递至后端做 RBAC -
日志审计:在 log_format 中加入
$ssl_client_s_dn $ssl_client_i_dn,确保每次调用都留痕可追溯 -
证书生命周期管理:所有客户端证书必须含
extendedKeyUsage = clientAuth,密钥严格存储于 HSM/TPM/KMS,禁止硬编码
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











