基于Istio信任链实现网格内外服务mTLS通信配置咨询
配置有效性判定
你当前编写的DestinationRule规则无法直接正常生效,核心原因有两点:
tls.mode: ISTIO_MUTUAL模式下,Istio Sidecar存在硬编码逻辑:不仅会校验对端证书由Istio信任的CA签发,还会强制要求对端证书的SAN字段符合Istio SPIFFE规范(格式为spiffe://<集群信任域>/ns/<命名空间>/sa/<绑定服务账号>),你手动给遗留工作负载签发的证书如果未携带符合要求的SAN,会直接被Sidecar拒绝连接。- 该模式下Sidecar不会将你配置的SNI与自定义证书校验逻辑绑定,无法跳过默认的SPIFFE SAN强制校验流程。
所需补充配置
不需要部署SPIFFE/SPIRE组件,仅需要调整证书签发参数、补充少量Istio配置即可实现目标,具体如下:
- 调整遗留工作负载的证书签发规则
使用Citadel根证书为遗留工作负载签发服务端证书时,必须给证书添加符合Istio SPIFFE格式的SAN扩展:spiffe://<你的Istio集群信任域,默认值为cluster.local>/ns/legacy/sa/<遗留工作负载Pod绑定的服务账号名称>,证书CN字段无强制要求。将签发完成的服务端证书、私钥部署到遗留工作负载8443端口的TLS监听配置中,确保握手时能正确返回该证书。如果遗留工作负载开启了双向TLS校验(即验证客户端证书合法性),需要将Citadel根证书加入遗留工作负载的客户端信任链,确保Sidecar自带的Istio签发的客户端证书能被正常信任。
- 修正DestinationRule配置
将TLS模式从ISTIO_MUTUAL修改为MUTUAL,手动指定Sidecar本地默认存放的Istio证书、根证书路径,保留原有SNI配置,修改后的参考配置如下:--- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: originate-mtls spec: host: mymtls-app.legacy.svc.cluster.local trafficPolicy: portLevelSettings: - port: number: 8443 tls: mode: MUTUAL sni: mymtls-app.legacy.svc.cluster.local # 以下为Sidecar容器内Istio证书的默认存放路径,无需额外挂载Secret clientCertificate: /etc/certs/cert-chain.pem privateKey: /etc/certs/key.pem caCertificates: /etc/certs/root-cert.pem注意:1.14及以上版本的Istio,证书默认存放路径为
/var/run/secrets/istio/目录,对应文件名不变,按实际部署的版本替换路径即可。 - 补充PeerAuthentication豁免规则
如果你全局配置了STRICT模式的mTLS校验,需要单独为legacy命名空间下的该遗留服务配置DISABLE模式的PeerAuthentication规则,避免Istio对未注入Sidecar的遗留工作负载强制要求原生Istio mTLS握手,拦截正常流量。 - (可选)配置Sidecar流量作用域
可以为访问该遗留服务的工作负载配置Sidecar资源,明确将legacy命名空间的服务纳入Sidecar的流量治理范围,避免出现流量路由异常,如果你此前已经配置过跨命名空间的服务发现规则可以跳过该步骤。
方案说明
该方案完全基于Istio原生证书加载逻辑实现,不需要额外挂载第三方Secret,也不依赖SPIFFE联邦能力,只要证书SAN配置符合要求,Sidecar就会像访问网格内普通服务一样完成mTLS握手。对比你之前实现的独立证书层级mTLS方案,该方案不需要手动给每个Sidecar挂载额外证书Secret,维护成本更低。
内容的提问来源于stack exchange,提问作者CppNoob
相关产品推荐
相关产品推荐

