我从name.com 获得了一张证书。
➜ tree .
.
├── ca.crt
├── vpk.crt
├── vpk.csr
└── vpk.key
我如何创建了这些密码
我将ca.crt的内容添加到vpk.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”到底在做什么,为什么“on”会导致请求失败?
nginx.ingress.kubernetes.io/auth-tls-secret: "ca-secret"
替换nginx.ingress.kubernetes.io/auth-tls-secret: "development/ca-secret"
吗?这个问题在相关的 github issue 中有提到。 我对auth-tls-verify-client有点困惑,你使用的是nginx.ingress.kubernetes.io/auth-tls-verify-client: "yes"
,但我认为应该是nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
,因为auth-tls-verify-client中没有yes
值,请尝试更改并重新测试一下。 - Jakubauth-tls-verify-client: "on"
,你收到了400错误,我认为auth-tls-secret
可能有问题。你尝试过将其更改为nginx.ingress.kubernetes.io/auth-tls-secret: "ca-secret"
并使用上述auth-tls-verify-client: "on"
吗? - Jakub