是否可以使用 istio 为通配符任意主机的出口流量发起 mTLS,但具有以下限制:
- 应用程序 pod 必须发出简单的 HTTP 请求,而不是 HTTPS。
- mTLS 的发起应该发生在出口网关。
- 必须使用自定义客户端和 CA 证书。
基本上,这种情况与官方文档Egress 中的示例不同,该示例使用带有 SNI 代理的通配符任意主机,具有以下内容:
- 应用程序 pod 使用的是 HTTP 而不是 HTTPS
curl http:\\host1.example.com
:。因此,mTLS 的发起应该发生在出口网关,而不是应用程序 pod。 - 使用自定义客户端和 CA 证书。
我尝试了所需的场景,但存在一个问题,即当出口网关将流量路由到 SNI nginx 代理 ( sni-proxy
) 时,它无法从 SNI TLS 标头中提取主机名。错误是:*18 no host in upstream ":443"
。SNI 不是由应用程序 pod ( sleep
) 设置的,因为它使用简单的 HTTP,而不是官方示例中的 HTTPS。未设置 SNI 时,SNI 代理无法将流量转发到特定主机。
在这种情况下,是否可以配置 istio egress gateway 以仅使用资源中的通配符主机名(如ServiceEntry
, DestinationRule
,VirtualService
等)将 mTLS 发起到特定主机?例如:应用程序 pod 传递 HTTP 请求头参数,如Host
,由 egress 网关使用来发起 mTLS 并设置 SNI 头,然后将由 SNI 代理将流量转发到特定主机?在这种情况下,出口网关将根据 HTTP 请求标头动态地将 mTLS 流量发起到特定主机?