You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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)模块实现,步骤如下:

  1. 编译安装Nginx时开启njs模块,或安装对应发行版的Nginx njs扩展包
  2. 新增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 };
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:27:03