NGINX 入口控制器、SSL 和 optional_no_ca

Dmi*_*nov 5 ssl nginx kubernetes kubernetes-ingress nginx-ingress

我已从 name.com 获得证书。

\n
\xe2\x9e\x9c tree .     \n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ca.crt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 vpk.crt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 vpk.csr\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 vpk.key\n
Run Code Online (Sandbox Code Playgroud)\n

我是如何创造秘密的

\n

我在 vpk.crt 文件末尾添加了 ca.crt 内容。

\n
(\xe2\x8e\x88 | vpk-dev-eks:argocd)\n\xe2\x9e\x9c k create secret tls tls-secret --cert=vpk.crt --key=vpk.key --dry-run -o yaml | kubectl apply -f -\n\n(\xe2\x8e\x88 | vpk-dev-eks:argocd)\n\xe2\x9e\x9c kubectl create secret generic ca-secret --from-file=ca.crt=ca.crt --dry-run -o yaml | kubectl apply -f -\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的入口:

\n
apiVersion: networking.k8s.io/v1beta1\nkind: Ingress\nmetadata:\n  name: websockets-ingress\n  namespace: development\n  annotations:\n    kubernetes.io/ingress.class: "nginx"\n    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"\n    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"\n    # Enable client certificate authentication\n    nginx.ingress.kubernetes.io/auth-tls-verify-client: "optional_no_ca"\n    # Create the secret containing the trusted ca certificates\n    nginx.ingress.kubernetes.io/auth-tls-secret: "development/ca-secret"\n    # Specify the verification depth in the client certificates chain\n    nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"\n    # Specify if certificates are passed to upstream server\n    nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"\n    argocd.argoproj.io/sync-wave: "10"\nspec:\n  tls:\n    - hosts:\n      - backend-dev.project.com\n      secretName: tls-secret\n  \n  rules:\n  - host: backend-dev.project.com\n    http:\n      paths:\n      - path: /ws/\n        backend:\n          serviceName: websockets-service\n          servicePort: 443\n
Run Code Online (Sandbox Code Playgroud)\n

证书已正确验证,我可以通过各种 CLI WebSocket 客户端进行连接,并且https://www.ssllabs.com/ssltest给我“A+”

\n

但是如果我设置

\n

nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"

\n

然后一切都停止工作,我在 nginx 入口控制器端收到 400 错误(POD 日志)。

\n

我对官方文档感到困惑:

\n

可选_no_ca 参数(1.3.8、1.2.5)请求客户端证书,但不要求它由受信任的 CA 证书签名。这适用于 nginx 外部的服务执行实际证书验证的情况。证书的内容可通过 $ssl_client_cert 变量访问。

\n

那么“Optional_no_ca”到底在做什么以及为什么“on”使请求失败?

\n

Pri*_*wad 4

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(错误请求)。检查以获取更多信息。