如何為監聽器設定 SNI?
注意
必須設定 TLS Inspector 監聽器篩選器,才能偵測請求的 SNI。
以下是上述要求的 YAML 範例。
address:
socket_address: { address: 127.0.0.1, port_value: 1234 }
listener_filters:
- name: "envoy.filters.listener.tls_inspector"
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.listener.tls_inspector.v3.TlsInspector
filter_chains:
- filter_chain_match:
server_names: ["example.com", "www.example.com"]
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
common_tls_context:
tls_certificates:
- certificate_chain: { filename: "example_com_cert.pem" }
private_key: { filename: "example_com_key.pem" }
filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
virtual_hosts:
- name: default
domains: "*"
routes:
- match: { prefix: "/" }
route: { cluster: service_foo }
- filter_chain_match:
server_names: "api.example.com"
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
common_tls_context:
tls_certificates:
- certificate_chain: { filename: "api_example_com_cert.pem" }
private_key: { filename: "api_example_com_key.pem" }
filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
virtual_hosts:
- name: default
domains: "*"
routes:
- match: { prefix: "/" }
route: { cluster: service_foo }
如何為叢集設定 SNI?
對於叢集,可以在 sni 中設定固定的 SNI。若要從下游 HTTP 標頭(例如 host
或 :authority
)衍生 SNI,請開啟 auto_sni 以覆寫 UpstreamTlsContext 中的固定 SNI。也可以使用選用的 override_auto_sni_header 欄位,提供 host
或 :authority
以外的自訂標頭。如果上游將提供 SAN 中帶有主機名稱的憑證,也請開啟 auto_san_validation。它仍然需要在 UpstreamTlsContext 的驗證內容中具有信任 CA 作為信任錨點。