在 nginx 中配置 ssl 证书双向认证,需要在 `server` 块中开启 `ssl` 并设置客户端证书验证。具体做法是启用 `ssl_verify_client on;`,同时指定 ca 证书路径 `ssl_client_certificate` 和验证深度 `ssl_verify_depth`。这样只有持有受信任 ca 签发证书的客户端才能建立连接。

Nginx 双向认证核心配置项有哪些
核心配置包括四个关键指令:`ssl_certificate` 用于服务器身份验证,`ssl_certificate_key` 提供私钥,`ssl_client_certificate` 存放颁发给客户端证书的 CA 证书,`ssl_verify_client` 控制验证模式。默认情况下该指令为 `off`,必须显式设置为 `on` 才能强制要求客户端提供证书。

server {
listen 443 ssl;
server_name example.com;
# 服务器证书与私钥
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# 客户端证书验证配置
ssl_client_certificate /etc/nginx/ssl/ca.crt;
ssl_verify_client on;
ssl_verify_depth 2;
location / {
proxy_pass http://backend;
}
}
上述配置中,`ssl_client_certificate` 指向的 `ca.crt` 文件必须包含所有被信任的根 CA 或中间 CA 证书。如果客户端证书是由私有 CA 签发的,该文件需包含对应的 CA 证书链。`ssl_verify_depth` 定义了证书链的最大长度,通常设为 1 或 2 即可满足大多数场景。当客户端未提供证书或证书不受信任时,Nginx 会返回 400 Bad Request 错误。
如何获取并传递客户端证书信息到后端
启用双向认证后,Nginx 会将客户端证书的相关信息存入环境变量,供后端应用使用。主要变量包括 `$ssl_client_cert`(完整 PEM 格式证书)、`$ssl_client_s_dn`(主题 distinguished name)和 `$ssl_client_i_dn`(颁发者 distinguished name)。这些变量可直接通过 HTTP Header 传递给后端服务。

location /api {
proxy_pass http://backend;
proxy_set_header X-Client-Cert $ssl_client_cert;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-Client-Issuer $ssl_client_i_dn;
}
在实际应用中,后端服务可以通过解析 `X-Client-Cert` 头中的 PEM 数据来提取用户身份信息。例如,从证书中提取 Common Name (CN) 或 Subject Alternative Name (SAN) 作为用户标识。这种方式无需在后端重新实现 TLS 握手逻辑,由 Nginx 统一处理证书验证,简化了架构设计。若需仅记录日志而不强制验证,可将 `ssl_verify_client` 设为 `optional_no_ca`,此时即使客户端无证书也会放行,但相关变量将为空。
客户端证书过期或吊销时如何处理
当客户端证书过期或被吊销时,Nginx 默认会拒绝连接并返回 400 错误。可通过配置 OCSP Stapling 或 CRL 来增强吊销检查能力。虽然 Nginx 不直接支持在线 OCSP 查询,但可结合外部工具或后端服务进行实时验证。对于离线场景,建议定期更新 `ca.crt` 文件以移除已吊销的 CA 证书。











