Kong 网关如何检索客户端证书并设置为 header

Kong gateway how to retrieve client cert and set to header

我正在使用 Kubernetes 和 kong 入口控制器。 我已经设置了客户端、Kong 网关和服务器。 客户端使用 mTLS 连接 Kong 网关,Kong 网关使用普通 HTTP 连接服务器,header 包含客户端证书 pem。

在nginx中我可以简单地添加这个配置。

server{
    location / {
        proxy_set_header ssl-client-cert $ssl_client_escaped_cert;
    }
}

在kong gateway中,我尝试设置helm values.yaml

env.nginx_proxy_proxy_set_header: "ssl-client-cert $ssl_client_escaped_cert"

但是在容器/etc/kong_prefix/nginx-kong.conf中,看起来是这样的,header没有发出去

server {
    proxy_set_header ssl-client-cert $ssl_client_escaped_cert;
}

我尝试使用插件 request-transformer 但它认为 $ssl_client_escaped_cert 是一个纯字符串。

apiVersion: configuration.konghq.com/v1
kind: KongClusterPlugin
metadata:
  name: kong-plugin-client-cert-header
  annotations:
    kubernetes.io/ingress.class: kong
  labels:
    global: "true"
config: 
  add:
    headers:
    - ssl-client-cert: $ssl_client_escaped_cert;
plugin: request-transformer

如何获取客户端证书并将其作为 header 发送到服务器?

您可以使用Kong Function插件进行自定义转换。从该插件中,您可以使用所有可用的 Nginx 变量:

例如,您的插件可以配置为:

apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: kong-plugin-client-cert-header
config:
  access:
  - |
    kong.service.request.set_header('ssl-client-cert', ('--' or ngx.var.ssl_client_escaped_cert))
plugin: post-function

我用过这个配置。我为我工作。

apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: kong-plugin-client-cert-header
config:
  access:
    - |
      kong.service.request.set_header('ssl-client-cert', ngx.var.ssl_client_escaped_cert or '')
plugin: post-function

我结合Keycloak client certificate lookup使用了这个函数。