使用客户端证书身份验证的NGINX代理到Ingress Controller

时间:2020-05-01 18:05:12

标签: authentication ssl nginx kubernetes proxy

在生产环境中,我有一个包含两个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页面。 这是因为预期的行为。

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

1 个答案:

答案 0 :(得分:1)

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

proxy_ssl_server_name on;

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