You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:43:24