如何配置Nginx Ingress允许SSL透传‘无效客户端证书’
解决Nginx Ingress SSL透传时客户端证书无效的问题
问题根源
你的场景里,ServiceA要求客户端证书,同时自身用的是自签服务端证书(所以直接curl访问需要加-k忽略服务端证书校验)。但当前Nginx Ingress的SSL透传没有真正生效——它没有做四层流量转发,而是尝试以七层代理的方式和后端建立HTTPS连接:
- 作为客户端的Nginx没有携带客户端证书给ServiceA,导致后端返回
bad certificate错误 - 同时Nginx默认不信任ServiceA的自签证书,也会触发握手失败
另外同一域名下存在未启用ssl-passthrough的Ingress,会干扰透传规则的优先级,导致透传配置不生效。
解决步骤
1. 提升SSL透传Ingress的优先级
给ServiceA的Ingress添加优先级注解,确保它在同一域名的Ingress规则中优先被应用:
nginx.ingress.kubernetes.io/ssl-passthrough-priority: "100"
数值越大优先级越高,只要比同域名下其他Ingress的优先级高即可。
2. 调整Ingress注解,避免七层代理干扰
SSL透传是四层转发,不需要backend-protocol: "HTTPS"注解(之前移除该注解报错,是因为透传未生效,Nginx尝试用HTTP连接后端HTTPS端口导致连接中断)。现在先保留ssl-passthrough: "true"并添加优先级注解后,移除backend-protocol配置:
# 移除这一行 # nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/ssl-passthrough: "true" nginx.ingress.kubernetes.io/ssl-passthrough-priority: "100"
3. 验证透传是否生效
进入Nginx Ingress控制器Pod,查看生成的配置文件/etc/nginx/nginx.conf,确认对应域名的配置是stream模块下的四层转发,而非http模块的七层代理。正确的透传配置类似:
stream { server { listen 443; ssl_preread on; proxy_pass ServiceA的后端服务地址; } }
4. 测试请求
透传生效后,客户端请求会直接和ServiceA建立TLS连接:
- 需要携带正确的客户端证书
- 如果客户端不信任ServiceA的自签证书,需添加
-k参数(或把后端证书导入客户端信任列表),此时请求结果会和直接端口转发访问的效果一致。
内容的提问来源于stack exchange,提问作者GeF
相关产品推荐
相关产品推荐

