如何配置Nginx将入站完整客户端证书链转发至后端中间件
Nginx 转发完整客户端证书链的实现方案
标准开源Nginx的ngx_http_ssl_module模块原生提供的$ssl_client_cert、$ssl_client_escaped_cert变量确实仅返回客户端叶子证书,没有内置配置项可以直接获取完整证书链,可通过以下两种方案实现需求:
方案1:使用第三方扩展模块
你可以编译Nginx时引入第三方ngx_ssl_client_cert_chain模块,该模块会新增$ssl_client_cert_chain变量,直接返回PEM格式的完整客户端证书链(包含中间CA证书和叶子证书)。
配置示例:
# 转发完整证书链到后端 proxy_set_header X-Client-Cert-Full-Chain $ssl_client_cert_chain;
方案2:使用Nginx官方njs模块实现
如果不想引入第三方非官方模块,可以用Nginx官方支持的njs(Nginx JavaScript)模块实现,步骤如下:
- 编译安装Nginx时开启njs模块,或安装对应发行版的Nginx njs扩展包
- 新增njs脚本
ssl_chain.js,内容如下:
function get_full_client_cert_chain(r) { const cert_chain = r.ssl.get_client_cert_chain(); return cert_chain ? cert_chain.toString('pem') : ''; } export default { get_full_client_cert_chain };
- 修改Nginx配置:
# 顶层配置加载njs模块 load_module modules/ngx_http_js_module.so; http { # 引入自定义njs脚本 js_import conf.d/ssl_chain.js; # 注册自定义变量存储完整证书链 js_set $ssl_client_full_chain get_full_client_cert_chain; server { # 原有SSL相关配置 listen 443 ssl; ssl_certificate server.crt; ssl_certificate_key server.key; ssl_client_certificate trusted_ca_chain.crt; ssl_verify_client on; location / { # 转发完整证书链到后端服务 proxy_set_header X-Client-Full-Chain $ssl_client_full_chain; proxy_pass http://你的后端服务地址; # 可选配置:避免证书链过长导致header被截断 proxy_buffer_size 16k; large_client_header_buffers 4 16k; } } }
注意事项
- 若使用自定义Header传递证书链,建议开启
underscores_in_headers on;配置,避免Nginx默认丢弃带下划线的Header - 需确保客户端确实会发送完整的证书链,否则Nginx侧无法获取到缺失的中间CA证书,可通过开启客户端证书校验强制要求客户端提交完整链
内容的提问来源于stack exchange,提问作者mandeep
相关产品推荐
相关产品推荐

