Kubernetes NGINX Ingress测试mTLS时出现302错误求助
排查Ingress mTLS配置导致302跳转问题
问题现象
测试mTLS功能时,执行curl命令访问Ingress定义的主机my.example.com返回302错误:
$ curl https://my.example.com --cert client.crt --key client.key -k
返回内容:
<html> <head><title>302 Found</title></head> <body> <center><h1>302 Found</h1></center> <hr><center>nginx</center> </body> </html>
Ingress Controller日志记录:
kubectl logs ingress-nginx-controller-79236f5c-gzgwl -n ingress-nginx -f ... 192.168.219.64 - - [15/Aug/2022:17:56:53 +0000] "GET / HTTP/1.1" 302 138 "-" "curl/7.29.0" 80 0.000 [] [] - - - - ae4b4fd210
已确认通过nginx-svc的Cluster IP可正常访问后端服务。
现有Ingress配置
kind: Ingress metadata: annotations: 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: "1" nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true" name: nginx-ingress namespace: default spec: ingressClassName: nginx rules: - host: my.example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-svc port: number: 80 tls: - hosts: - my.example.com secretName: tls-secret
问题排查与修复方向
302跳转大概率是Nginx Ingress Controller在mTLS验证失败时触发的默认行为,而非后端服务返回。重点排查以下几点:
CA证书格式有效性
检查default/ca-secret中的CA证书是否为标准PEM格式,无多余换行或注释。执行验证命令:kubectl get secret ca-secret -n default -o jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -text -noout若命令报错,说明CA证书格式错误,需重新生成标准PEM格式证书并更新secret。
客户端证书信任链
确认client.crt由ca-secret中的CA签发,信任链完整。执行验证命令:openssl verify -CAfile <(kubectl get secret ca-secret -n default -o jsonpath='{.data.ca\.crt}' | base64 -d) client.crt返回
OK则信任链正常,否则需重新签发客户端证书。mTLS验证失败后的响应配置
当前auth-tls-verify-client: "on"强制要求客户端证书,验证失败时Nginx默认返回302。可添加注解让失败返回明确的403,便于定位:metadata: annotations: # 保留原有注解,新增以下配置 nginx.ingress.kubernetes.io/auth-tls-error-page: "403"重新应用配置后,若curl返回403,说明mTLS验证失败,聚焦证书问题;若仍返回302,再排查Ingress Controller全局重定向规则。
Ingress Controller版本兼容性
部分旧版本Nginx Ingress Controller存在mTLS处理bug,若上述排查无问题,建议升级至v1.2+稳定版本后重试。
内容的提问来源于stack exchange,提问作者Technext
相关产品推荐
相关产品推荐

