如何为监听器配置 SNI?

SNI 仅在 v3 配置/API 中受支持。

注意

必须配置 TLS 检查器 监听器过滤器才能检测到请求的 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 用于信任锚点。