在生产环境中,我有一个包含两个Nginx的配置,并且两个服务器之间的通信使用此配置来保护,如下所示: https://docs.nginx.com/nginx/admin-guide/security-controls/securing-http-traffic-upstream/
INTERNET ---> NGINX reverse proxy ---TLS authentication---> NGINX upstream ---> Application
conf按预期方式工作,上游仅接受受信任证书的请求。
但是我需要将上游服务器从裸机服务器迁移到Azure Kubernetes Service上的Kubernetes群集。 因此,充当反向代理的服务器上的conf保持不变,我将上游的配置迁移到NGINX Ingress Controller。
我已经部署了Ingress Controller的以下图像: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
并按如下所示配置资源:
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-backend
namespace: dev
annotations:
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-secret: "dev/my-cert"
nginx.ingress.kubernetes.io/auth-tls-error-page: "https://google.com"
spec:
tls:
- hosts:
- my-backend.my-domain
secretName: my-cert
rules:
- host: my-backend.my-domain
http:
paths:
- path: /
backend:
serviceName: my-backend-service
servicePort: http
称为“ my-cert”的秘密包括:从NGINX上游导入的ca.crt tls.crt tls.key。 https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#client-certificate-authentication
NGINX反向代理中的配置未更改:
location / {
set $upstream my-upstream;
proxy_pass https://$upstream$request_uri;
proxy_set_header Host my-backend.my-domain;
proxy_set_header X-Request-ID $request_id;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_ssl_certificate /etc/nginx/ssl/client.pem;
proxy_ssl_certificate_key /etc/nginx/ssl/client.key;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
proxy_ssl_trusted_certificate /etc/nginx/CA/CA.pem;
proxy_ssl_session_reuse on;
}
尝试进行配置的第一次尝试是从反向代理到通过客户端证书的Ingress Controller的curl请求:
curl --cacert /etc/nginx/CA/CA.pem --key /etc/nginx/ssl/client.key --cert /etc/nginx/ssl/client.pem https://my-backend.my-domain/health
{"status":"UP"}
有效!
但是尝试通过NGINX反向代理发送请求,但我已按照Ingress Controller中的配置重定向到google.com页面。 这是因为预期的行为。
有人可以帮助我修复配置并使身份验证正常工作吗?
答案 0 :(得分:1)
我需要在NGINX客户端上启用SNI支持:
proxy_ssl_server_name on;
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name