配置多个使用相同 TLS 证书的网关时出现 404 错误
目录
问题描述
现象
通过 Istio Ingress Gateway 使用 HTTP/2 协议访问服务时,出现 404 错误。这是 Istio Community 中的已知问题。
根本原因
配置多个使用相同 TLS 证书的网关时,HTTP/2 浏览器在建立初始连接后访问次要主机会产生 404 错误。这是由于浏览器中 HTTP/2 连接复用导致的。
示例场景:
- 域名
a.example.com和b.example.com共享相同 TLS 证书 - 分别配置在不同的 Gateway 资源中
- 浏览器通过同一连接先访问
a.example.com,再访问b.example.com
故障排查
验证脚本
在部署 Istio Ingress Gateway 的集群主节点上执行此脚本:
预期输出:
根本原因 1 的解决方案:合并 Gateway 资源
注意事项
- 这是社区推荐的解决方案
- 保持 HTTP/2 的性能优势
- 需要修改现有 Gateway 配置
前提条件
- 集群节点安装了
jqv1.7 及以上版本 - 具备使用 kubectl 的集群访问权限
操作步骤
- 使用验证脚本识别冲突的 Gateway
- 合并 Host 配置:
- 更新 VirtualServices 以引用合并后的 Gateway
- 删除冗余的 Gateway
- 验证配置:
根本原因 2 的解决方案:421 响应码
注意事项
- 需要客户端支持 421 状态码
- 兼容 Chrome/Firefox/Safari 15.1 及以上版本
前提条件
- Istio 版本 ≥ 1.12
- 集群管理员权限
操作步骤
- 应用 EnvoyFilter:
- 验证实现:
预防措施
- 证书管理:
- 使用通配符证书(*.example.com)
- 避免跨环境复用证书
- Gateway 设计:
- 每个域名模式实现单一网关
- 使用基于命名空间的证书隔离
- 定期审计:
相关内容
HTTP/2 连接复用机制:
- 单个 TLS 连接处理多个请求
- 服务器使用 SNI 路由请求
- SNI 头不匹配导致路由失败
Istio 文档参考: Istio Common Problems - 404 Errors