簡體   English   中英

Nginx controller 客戶端身份驗證 optional_no_ca 不起作用

[英]Nginx controller Client Authentication optional_no_ca not working

我們正在使用 Kubernetes,我們需要檢查客戶端證書。 我們需要配置 Nginx 入口 controller 以便將客戶端證書(如果存在)傳遞給后端服務。 我們在測試環境中成功配置了它。 這里我們有以下版本:

  • 容器運行時docker://19.3.8
  • kubelet 版本 v1.17.6
  • 寧寧 1.17

我們使用了這個入口配置:

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
  • 寧寧 1.19

生產中的問題是,盡管我們指定了指令optional_no_ca ,但入口 controller 要求提供客戶端證書並嘗試驗證它,但它失敗了你知道為什么會發生這種情況嗎?

謝謝

安傑洛

編輯

通過閱讀here ,我似乎應該使用這些注釋。 但是通過添加它們,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 入口 controller 版本:nginx-ingress-controller:nginx-0.35.0-rancher2
  • nginx 版本:1.19.2
  • 打開版本:OpenSSL 1.1.1g 2020 年 4 月 21 日

任何提示將不勝感激......我在這個問題上戰斗了好幾天

編輯 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 入口 controller 日志中,我看到:

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 入口 controller error_page指令。 Maybe should I configure the Nginx ingress controller ConfigMap ( https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md#custom-http-errors )?

即使在指定optional_no_ca參數之后,也必須提供客戶端證書,並且由於使用此參數,證書不是必須由受信任的 CA 1 2簽名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM