如何在Kubernetes的Nginx Ingress Controller中验证mTLS证书链
实现基于完整证书链的Nginx Ingress mTLS
要验证包含根CA→CA A→CA B→CA C→客户端证书的完整信任链,你需要完成以下关键步骤:
1. 构建完整的信任链证书文件
将所有需要信任的CA证书(根CA、CA A、CA B、CA C)合并为一个PEM格式文件,确保Nginx能通过这些证书追溯到根CA完成验证。
执行命令合并证书(确保每个证书的PEM块完整,包含-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----):
cat root-ca.pem ca-a.pem ca-b.pem ca-c.pem > full-ca-chain.pem
2. 更新Kubernetes CA Secret
替换原有的ca-secret,使其包含合并后的完整信任链证书。Kubernetes TLS Secret要求必须包含tls.crt和tls.key字段,这里tls.key可使用根CA的私钥(Nginx验证客户端证书时不会用到该私钥,但需符合Secret格式要求):
# 删除原有Secret(如果存在) kubectl delete secret ca-secret -n default # 创建新的Secret,使用完整信任链证书 kubectl create secret tls ca-secret -n default --cert=full-ca-chain.pem --key=root-ca.key
3. 调整Ingress注解的验证深度
修改Ingress的auth-tls-verify-depth注解,设置为匹配你的证书链长度。你的链从客户端证书到根CA共有4层验证层级(客户端→CA C→CA B→CA A→根),因此验证深度需设为4:
metadata: annotations: nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true" nginx.ingress.kubernetes.io/auth-tls-secret: default/ca-secret nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" nginx.ingress.kubernetes.io/auth-tls-verify-depth: "4"
4. 验证配置生效
更新Ingress资源后,等待Nginx Ingress Controller自动加载新配置。可以通过以下方式验证:
- 查看Ingress Controller Pod的日志,确认配置加载无错误
- 进入Controller Pod查看生成的
nginx.conf,确认存在ssl_client_certificate指向完整信任链、ssl_verify_depth 4和ssl_verify_client on配置
最后,使用带有客户端证书的请求测试:
curl --cert client-cert.pem --key client-key.pem https://your-ingress-domain/your-path
内容的提问来源于stack exchange,提问作者arwa abdelhalim
相关产品推荐
相关产品推荐

