NGINX 入口控制器、SSL 和 optional_no_ca
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”到底在做什么,为什么“on”请求失败?
Optional_no_ca 执行可选的客户端证书验证,并且当客户端证书未由来自 auth 的 CA 签名时,它不会使请求失败-tls-秘密。即使在指定了 optional_no_ca 参数后,也需要提供客户端证书。正如文档1中提到的,实际的证书验证是在 Nginx 外部服务时完成的。
当您设置 nginx.ingress.kubernetes.io/auth-tls-verify-client:on 时,
它请求一个客户端证书,该证书必须由 nginx.ingress.kubernetes 指定的密钥的密钥 ca.crt 中包含的证书签名。 io/auth-tls-secret: 秘密名称.
否则,证书验证将失败并导致状态代码 400(错误请求)。检查 this 了解更多信息。
我已经获得了 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”到底在做什么,为什么“on”请求失败?
Optional_no_ca 执行可选的客户端证书验证,并且当客户端证书未由来自 auth 的 CA 签名时,它不会使请求失败-tls-秘密。即使在指定了 optional_no_ca 参数后,也需要提供客户端证书。正如文档1中提到的,实际的证书验证是在 Nginx 外部服务时完成的。
当您设置 nginx.ingress.kubernetes.io/auth-tls-verify-client:on 时, 它请求一个客户端证书,该证书必须由 nginx.ingress.kubernetes 指定的密钥的密钥 ca.crt 中包含的证书签名。 io/auth-tls-secret: 秘密名称.
否则,证书验证将失败并导致状态代码 400(错误请求)。检查 this 了解更多信息。