我在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: https
或X-Forwarded-Port: 443
。
有人可以确认注释的预期行为吗?
我是否还需要使用tls配置后端?
编辑
我确实访问了入口Pod,并且在nginx配置中找不到对ssl_client_s_dn
的任何引用,我希望它是将证书信息传递给标头的最佳人选。
我尝试按照https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/customization/custom-headers中的步骤分配一些自定义标头,但这似乎也不起作用。
答案 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: "*"
如果您要基于入口规则修改标头,则还可以在入口规则中添加注释。