要让Nginx代理后端时透传客户端SSL证书信息,需启用mTLS并用$ssl_client_escaped_cert安全传递证书,配合X-Client-Verify、X-Client-DN等头传递校验结果与身份信息,且必须先配置ssl_verify_client on及正确CA证书。

要让 Nginx 在代理后端服务时透传客户端 SSL 证书信息,核心是启用双向 TLS(mTLS)并安全地将验证后的证书内容传递给后端,而不是简单转发原始证书字段。
前提:正确启用客户端证书校验
只有在 Nginx 成功完成客户端证书验证后,相关变量才可用。需确保以下配置已就位:
- ssl_verify_client on; —— 强制校验,不可省略
- ssl_client_certificate 指向可信 CA 的 PEM 公钥文件(非私钥)
- ssl_certificate 和 ssl_certificate_key 已正确配置服务端证书
- Nginx 版本 ≥ 1.19.7(否则无法使用安全透传变量)
安全透传证书内容:用 $ssl_client_escaped_cert
直接使用 $ssl_client_cert 会因证书含换行符、空格等导致 HTTP header 截断或解析失败。应改用 URL 编码格式的变量:
- 在
location块中添加:proxy_set_header X-Client-Cert-Escaped $ssl_client_escaped_cert; - 该变量只在验证成功时有值,无需额外判空
- 后端收到后需用对应语言解码,如 Python 用
urllib.parse.unquote(),Node.js 用decodeURIComponent()
配套透传身份与状态信息
仅传证书内容不够,还需附带校验结果和可读标识,便于后端快速决策:
-
proxy_set_header X-Client-Verify $ssl_client_verify;—— 返回 SUCCESS/FAILED/NONE -
proxy_set_header X-Client-DN $ssl_client_s_dn;—— 主题名(已自动转义,相对安全) -
proxy_set_header X-Client-CN $ssl_client_s_dn_cn;—— 仅 CN 字段,轻量且无换行
避免常见错误
以下配置看似合理,实则无效或存在风险:
- 在未启用
ssl_verify_client on的情况下使用$ssl_client_cert变量 —— 值为空 - 用
$ssl_client_cert直接设为 header —— 易被截断,多数后端无法还原完整证书 - 把 CA 文件路径写错、权限设为 600(公钥文件应为 644)、或混入私钥/多余空格 —— 导致校验静默失败


















