![](/img/trans.png)
[英]Nginx controller Client Authentication optional_no_ca not working
[英]NGINX Ingress controller, SSL and optional_no_ca
我已經從 name.com 獲得了證書。
➜ tree .
.
├── ca.crt
├── vpk.crt
├── vpk.csr
└── vpk.key
我是如何創造秘密的
我在 vpk.crt 文件的末尾添加了 ca.crt 內容。
(⎈ | vpk-dev-eks:argocd)
➜ k create secret tls tls-secret --cert=vpk.crt --key=vpk.key --dry-run -o yaml | kubectl apply -f -
(⎈ | vpk-dev-eks:argocd)
➜ kubectl create secret generic ca-secret --from-file=ca.crt=ca.crt --dry-run -o yaml | kubectl apply -f -
這是我的入口:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: websockets-ingress
namespace: development
annotations:
kubernetes.io/ingress.class: "nginx"
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: "development/ca-secret"
# 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"
argocd.argoproj.io/sync-wave: "10"
spec:
tls:
- hosts:
- backend-dev.project.com
secretName: tls-secret
rules:
- host: backend-dev.project.com
http:
paths:
- path: /ws/
backend:
serviceName: websockets-service
servicePort: 443
證書經過正確驗證,我可以通過各種 CLI WebSocket 客戶端進行連接,並且https://www.ssllabs.com/ssltest給了我“A+”
但是,如果我設置
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
然后一切都停止工作,我在 nginx 入口控制器端(POD 日志)收到 400 錯誤。
我對官方文檔感到困惑:
optional_no_ca 參數(1.3.8、1.2.5)請求客戶端證書,但不要求它由受信任的 CA 證書簽名。 這適用於 nginx 外部服務執行實際證書驗證的情況。 證書的內容可通過 $ssl_client_cert 變量訪問。
Optional_no_ca執行可選的客戶端證書驗證,並且當客戶端證書不是來自auth-tls-secret的 CA 簽名時,它不會使請求失敗。 即使指定了 optional_no_ca 參數,也需要提供客戶端證書。 如文檔1中所述,當服務在 Nginx 外部時,會進行實際的證書驗證。
當您設置nginx.ingress.kubernetes.io/auth-tls-verify-client:on 時,它會請求一個客戶端證書,該證書必須由包含在nginx指定的密鑰的密鑰ca.crt中的證書簽名。 ingress.kubernetes.io/auth-tls-secret: secretName 。
如果不是這樣,則證書驗證將失敗並導致狀態代碼 400(錯誤請求)。 檢查此以獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.