Nginx Ingress:将客户端证书信息传递给后端

时间:2020-05-14 17:04:20

标签: flask kubernetes 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",但是请求标头中似乎缺少该信息(我只是从flask应用程序中打印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中的步骤分配一些自定义标头,但这似乎也不起作用。

2 个答案:

答案 0 :(得分:1)

您正在使用哪个版本的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", 
  }
}

您随时可以添加自己的自定义标题,如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", 
  }
}

答案 1 :(得分:0)

您可以在Nginx Ingress服务中传递注释

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

如果您要基于入口规则修改标头,则还可以在入口规则中添加注释。

相关问题