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

实现上游服务Proxy mTLS认证:动态选择客户端证书方案咨询

动态选择上游客户端证书的代理方案

针对你的场景,以下几种工具可以实现根据原客户端动态选择上游证书的需求:

Envoy Proxy 方案

Envoy的Lua扩展能力可轻松实现动态证书选择逻辑:

  • 先配置Envoy启用客户端证书认证,确保能获取客户端证书的元数据(如Subject CN、证书指纹)。
  • 将所有客户端对应的上游证书/密钥按规则命名(比如用客户端证书的CN作为文件名),存放在指定目录。
  • 在HTTP过滤器链中添加Lua过滤器,在请求转发前执行以下逻辑:
    1. 从请求上下文提取客户端证书的唯一标识(如CN);
    2. 根据标识找到对应的上游证书和密钥文件;
    3. 动态加载证书并设置到上游连接的SSL上下文。
  • 核心配置示例:
    http_filters:
    - name: envoy.filters.http.lua
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
        inline_code: |
          function envoy_on_request(request_handle)
            local cert = request_handle:streamInfo():sslConnection():peerCertificate()
            local client_cn = cert:subject():commonName()
            -- 假设证书文件路径为 /certs/upstream-${client_cn}.pem 和 /certs/upstream-${client_cn}.key
            local cert_path = "/certs/upstream-" .. client_cn .. ".pem"
            local key_path = "/certs/upstream-" .. client_cn .. ".key"
            -- 加载并设置上游证书
            request_handle:streamInfo():dynamicMetadata():set("envoy.ssl", {
              upstream_cert_path = cert_path,
              upstream_key_path = key_path
            })
          end
    

OpenResty(Nginx + Lua)方案

OpenResty扩展了Nginx的Lua能力,支持动态操作SSL上下文:

  • 安装OpenResty并确保启用ngx.ssl模块。
  • 配置Nginx接收并验证客户端证书:
    server {
      listen 443 ssl;
      ssl_certificate /path/to/proxy-cert.pem;
      ssl_certificate_key /path/to/proxy-key.pem;
      # 启用客户端证书认证
      ssl_client_certificate /path/to/ca-cert.pem;
      ssl_verify_client on;
    }
    
  • 在access_by_lua_block中实现动态证书选择:
    access_by_lua_block {
      -- 提取客户端证书的CN
      local ssl = require "ngx.ssl"
      local peer_cert, err = ssl.peercert()
      local client_cn = ssl.x509_parse_dn(peer_cert)["CN"]
      -- 从映射表获取对应上游证书路径
      local cert_map = {
        ["client1"] = "/certs/upstream-client1.pem",
        ["client2"] = "/certs/upstream-client2.pem"
      }
      local key_map = {
        ["client1"] = "/certs/upstream-client1.key",
        ["client2"] = "/certs/upstream-client2.key"
      }
      -- 动态设置上游证书
      local cert_data = assert(io.open(cert_map[client_cn], "r"):read("*a"))
      local key_data = assert(io.open(key_map[client_cn], "r"):read("*a"))
      assert(ssl.set_cert(ssl.parse_pem_cert(cert_data)))
      assert(ssl.set_priv_key(ssl.parse_pem_priv_key(key_data)))
    }
    

HAProxy 方案

HAProxy 2.0+版本支持通过ACL和映射文件实现动态证书选择:

  • 创建映射文件client-cert-map.txt,关联客户端CN与上游证书路径:
    client1 /certs/upstream-client1.pem
    client2 /certs/upstream-client2.pem
    
  • 配置HAProxy验证客户端证书,并根据CN选择上游证书:
    frontend proxy_frontend
      bind *:443 ssl crt /path/to/proxy-cert.pem ca-file /path/to/ca-cert.pem verify required
      # 提取客户端证书CN
      acl client_cn_client1 ssl_c_s_dn cn -i client1
      acl client_cn_client2 ssl_c_s_dn cn -i client2
      # 根据ACL选择对应的上游证书
      use_backend upstream_server client_cn_client1 ssl-client-cert /certs/upstream-client1.pem
      use_backend upstream_server client_cn_client2 ssl-client-cert /certs/upstream-client2.pem
    
    backend upstream_server
      server original_service 192.168.1.100:443 ssl
    

通用注意事项

  • 所有客户端证书需提前通过CA验证,避免非法请求;
  • 证书文件需设置严格的权限(如chmod 600),防止密钥泄露;
  • 证书更新时,使用工具的热重载功能(如envoy -c config.yaml --hot-restart、openresty -s reload)避免服务中断。

内容的提问来源于stack exchange,提问作者Jakub Koudelka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:28:32