【问题标题】:Nginx Ingress: passing client certificate info to backendNginx Ingress:将客户端证书信息传递到后端
【发布时间】:2020-08-31 07:57:26
【问题描述】:

我在我的 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 配置后端吗?

编辑

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

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

【问题讨论】:

    标签: flask kubernetes nginx-ingress


    【解决方案1】:

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

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

    ssl_client_s_dn 的值通过默认 nginx 控制器设置作为 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", 
      }
    }
    

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

    例子:

    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", 
      }
    }
    

    【讨论】:

      【解决方案2】:

      你可以在 nginx ingress 的服务中传递注解

         annotations:
          service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '60'
          service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
      

      如果您想根据入口规则修改标头,那么您也可以向入口规则添加注释。

      【讨论】:

        猜你喜欢
        • 2021-10-22
        • 2018-09-17
        • 2017-07-04
        • 2021-03-28
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 2020-07-24
        相关资源
        最近更新 更多