Istio服务网格出站访问外部HTTPS资源SSL证书验证错误求助
根因分析
你遇到的问题是Istio出站路由匹配异常导致的流量错发:
- 你开启了
REGISTRY_ONLY出站拦截模式,所有未在Istio注册的外部服务都会被拦截 - 原有配置中
ServiceEntry使用HTTPS协议、同时DestinationRule配置了SIMPLE模式TLS Origination,而你的Java应用本身也在发起HTTPS请求,形成双重TLS封装:Sidecar无法识别加密流量中的Host字段,匹配不到你配置的ServiceEntry规则,导致路由错乱,请求被转发到了缓存的Google服务后端IP,因此返回了Google的证书,进而触发Java的证书SAN校验失败报错。
解决方案
提供两种适配不同场景的方案,二选一即可:
方案1:透传应用TLS请求(无需修改应用代码)
适合保留应用本身HTTPS请求逻辑的场景:
- 修改ServiceEntry配置,将端口协议改为
TLS,支持SNI匹配,同时可直接用通配符匹配所有cmp.net子域名减少冗余配置:
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: internalnet namespace: ppct spec: hosts: - "*.cmp.net" exportTo: - "." ports: - number: 443 name: tls protocol: TLS location: MESH_EXTERNAL resolution: DNS
- 删除原有三个单独配置的DestinationRule,不需要Sidecar做TLS封装,直接透传应用的HTTPS流量即可。
方案2:Sidecar统一做TLS封装(需要修改应用请求逻辑)
适合由Istio统一管理外部服务TLS证书的场景:
- 调整ServiceEntry配置,使用通配符域名:
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: internalnet namespace: ppct spec: hosts: - "*.cmp.net" exportTo: - "." ports: - number: 443 name: https protocol: HTTPS location: MESH_EXTERNAL resolution: DNS
- 合并DestinationRule为一个统一配置,显式指定SNI避免匹配错误:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: internalnet namespace: ppct spec: host: "*.cmp.net" trafficPolicy: tls: mode: SIMPLE sni: "%HOST%"
- 修改应用代码,将请求地址从
https://x.cmp.net/doc.pdf改为http://x.cmp.net:443/doc.pdf,应用侧发明文HTTP请求,由Sidecar统一封装为HTTPS发往外部服务。
验证方法
配置更新后进入应用容器验证:
- 方案1:执行
openssl s_client -showcerts -connect x.cmp.net:443 -servername x.cmp.net,确认返回的证书为DigiCert颁发的*.cmp.net证书即可 - 方案2:执行
curl http://x.cmp.net:443/doc.pdf,确认可以正常获取资源即可
内容的提问来源于stack exchange,提问作者lukisp
相关产品推荐
相关产品推荐

