Nginx控制器中客户端身份验证的optional_no_ca选项不起作用。

7
我们正在使用Kubernetes,需要检查客户端证书。我们需要配置Nginx Ingress控制器,以便将客户端证书(如果存在)传递给后端服务。我们已经在测试环境中成功地进行了配置。这里是我们的版本信息:
  • 容器运行时docker://19.3.8
  • Kubelet版本v1.17.6
  • nging 1.17
我们使用以下Ingress配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: login-cns-produzione-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/configuration-snippet: "proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;"
    nginx.ingress.kubernetes.io/server-snippet: "ssl_verify_client optional_no_ca ;"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
    - hosts:
        - login-cns.it
  rules:
  - host: login-cns.it
    http:
      paths:
      - path: /
        backend:
          serviceName: login-cns-produzione-service
          servicePort: 443

在我们的生产环境中,有些东西比测试环境更新。以下是生产环境的版本:
- 容器运行时docker://19.3.15 - Kubelet 版本v1.18.15 - nging 1.19
生产环境的问题是,尽管我们指定了指令optional_no_ca,但负载均衡控制器仍要求客户端证书并试图验证它,但验证失败了。您有关于为什么会发生这种情况的任何想法吗?
谢谢
安杰洛
编辑
通过阅读此处,似乎我应该使用这些注释。但是添加它们后,Nginx不会要求客户端证书。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: login-cns-test-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    # Enable client certificate authentication
    nginx.ingress.kubernetes.io/auth-tls-verify-client: "optional_no_ca"
    # Create the secret containing the trusted ca certificates
    nginx.ingress.kubernetes.io/auth-tls-secret: "wso2is-collaudo/iamcoll-it"
    # Specify the verification depth in the client certificates chain
    nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
    # Specify if certificates are passed to upstream server
    nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
    nginx.ingress.kubernetes.io/auth-tls-error-page: "/cns/saml/dettagli-utente"
spec:
  tls:
    - hosts:
        - login-cns-test.it
  rules:
  - host: login-cns-test.it
    http:
      paths:
      - path: /
        backend:
          serviceName: login-cns-test-service
          servicePort: 443

非常奇怪的是,在之前的注释中,我有一些X.509身份验证成功,而另一些则失败了。我真的无法解释这个问题。
关于版本的更多信息:
- nginx ingress控制器版本:nginx-ingress-controller:nginx-0.35.0-rancher2 - nginx版本:1.19.2 - OpenSSL版本:OpenSSL 1.1.1g 21 Apr 2020
任何提示都将不胜感激... 我已经为此问题奋斗了几天。
编辑2:
如果我使用这个配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: login-cns-test-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/configuration-snippet: |
                        proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;
                        error_page 495 496 497 ​/cns/saml/dettagli-utente;
    nginx.ingress.kubernetes.io/server-snippet: |
                         ssl_verify_client optional_no_ca;
                         if ($ssl_client_verify != SUCCESS) {
                              return 495;
                          }
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
    - hosts:
        - login-cns-test.it
  rules:
  - host: login-cns-test.it
    http:
      paths:
      - path: /
        backend:
          serviceName: login-cns-test-service
          servicePort: 443

客户端证书被要求,但是Nginx在证书验证时失败并停止...它不允许将请求路由到默认后端,而我在那里拥有所有的业务逻辑来检查和验证证书。
编辑3:
在我的nginx ingress控制器日志中,我看到:
2021/06/14 19:17:29 [crit] 9793#9793: *89059516 SSL_do_handshake() failed (SSL: error:0407E068:rsa routines:RSA_verify_PKCS1_PSS_mgf1:bad signature error:1417B07B:SSL routines:tls_process_cert_verify:bad signature) while SSL handshaking, client: XXX.YY.ZZ.WW, server: 0.0.0.0:443

到目前为止,一切都很顺利...我希望我的Java应用程序检查证书。但是所有的流程都在这里停止了。似乎我无法正确配置Nginx Ingress控制器的error_page指令。也许我应该配置Nginx Ingress控制器ConfigMap(https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md#custom-http-errors)?
1个回答

2

即使指定了 optional_no_ca 参数,仍然需要提供客户端证书。使用此参数后,证书不一定需要由受信任的 CA 签名,但仍需提供证书12


谢谢你的回答,但是...为什么在另一个环境中不会发生这种情况呢?也许之前的nginx版本没有检查证书? - Angelo Immediata
这似乎不是由于NGINX版本引起的,而可能与auth-tls-verify-client:ON密钥相关。请参考下面的帖子,看看是否有帮助:https://dev59.com/6r7pa4cB1Zd3GeqPwFJ5 - Anbu Thirugnana Sekar
我更新了我的问题……如果你能的话,请去那里看一下……谢谢。 - Angelo Immediata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接