首页 > 解决方案 > Nginx Ingress:将客户端证书信息传递到后端

问题描述

我在我的 aks 集群中成功实现了一个带有 tls 认证的入口(https://docs.microsoft.com/en-us/azure/aks/ingress-own-tls),但我想传递客户端中包含的信息证书到后端。我确实尝试将注释添加到我的入口nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true",但我的请求标头中似乎缺少信息(我只是request.headers从我的烧瓶应用程序中打印内容)。其他标题正确显示,例如X-Forwarded-Proto: httpsX-Forwarded-Port: 443

有人可以确认注释的预期行为吗?

我是否还需要使用 tls 以某种方式配置后端?

编辑

我确实访问了入口 pod,并且在 nginx 配置中我找不到对 的任何引用ssl_client_s_dn,我希望它是将证书信息传递到标头中的最佳候选者。

我尝试按照https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/customization/custom-headers中的步骤分配一些自定义标头,但这似乎也不起作用。

标签: flaskkubernetesnginx-ingress

解决方案


nginx-ingress您使用的是哪个版本?

至少在版本中0.30,我也可以看到客户端的证书详细信息正确传递到后端。

的值作为默认 nginx 控制器设置ssl_client_s_dn的标头传递Ssl-Client-Subject-Dn,无需自定义。

这是我默认的内容/etc/nginx/nginx.conf(从 ConfigMap 转换而来)

# Pass the extracted client certificate to the backend

        proxy_set_header ssl-client-cert        $ssl_client_escaped_cert;

        proxy_set_header ssl-client-verify      $ssl_client_verify;
        proxy_set_header ssl-client-subject-dn  $ssl_client_s_dn;
        proxy_set_header ssl-client-issuer-dn   $ssl_client_i_dn;

从后端角度看到的请求标头:

   ...
    "Ssl-Client-Issuer-Dn": "CN=example.com,O=example Inc.", 
    "Ssl-Client-Subject-Dn": "O=client organization,CN=client.example.com", 
    "Ssl-Client-Verify": "SUCCESS", 
    "User-Agent": "curl/7.58.0", 
    "X-Forwarded-Host": "httpbin.example.com", 
    "X-Scheme": "https", 
  }
}

您可以随时添加自己的自定义标头,如此处所述

例子:

apiVersion: v1
data:
  X-Client-Cert-Info: $ssl_client_s_dn
kind: ConfigMap
metadata:
...

在后端反映为:

    ...
    "X-Client-Cert-Info": "O=client organization,CN=client.example.com", 
    "X-Forwarded-Host": "httpbin.example.com", 
    "X-Scheme": "https", 
  }
}

推荐阅读