0

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

在 nginx 中,我可以简单地添加此配置。

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

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

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

但是在容器中/etc/kong_prefix/nginx-kong.conf,它看起来像这样并且标头没有发送出去。

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

如何获取客户端证书并作为标头发送到服务器?

4

2 回答 2

1

您可以使用 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
于 2022-01-25T11:39:16.797 回答
-1

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

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 客户端证书查找结合使用。

于 2022-01-31T15:37:07.740 回答