NGINX 代理到具有客户端证书身份验证的入口控制器

NGINX proxy to Ingress Controller with Client Certificate Authentication

在我的生产环境中,我有一个包含两个 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 服务上的 Kubernetes 集群。 因此,作为反向代理的服务器上的 conf 没有改变,我将上游的配置迁移到 NGINX Ingress Controller。

我已经部署了 Ingress Controller 的这个图像: 码头.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"的秘密包括:ca.crttls.crttls.key从NGINX上游导入。 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;
}

尝试配置的第一次尝试是从反向代理到传递客户端证书的入口控制器的 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 反向代理发送请求时,我被重定向到 google.com 页面,如 Ingress Controller 中所配置的那样。 这是预期的行为,因为。

有人可以帮助我修复配置并使身份验证正常工作吗?

我需要在 NGINX 客户端上启用 SNI 支持:

proxy_ssl_server_name on;

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name