JWT:json web token

mtls:mutual TLS 双向通信

Envoy三种配置方式:直接定义,静态定义secret,xDS中的secretDS

设定Secret:

定义Secret时, 通常有定义数字证书( 服务端或客户端) 、 票证密钥和证书校验机制三种类型, 但每个定义仅能指定为其中一种类型。

static_resources:
  listeners: []
  clusters: []
  secrets: [] # 静态指定的Secret列表, 定义时, 以下三种方式可选其一;
  - name: ... # 可用于引用此秘密( Secret) 的惟一标识;
    tls_cretificate: {...} # 数字证书
      certificate_chain: {...} # TLS证书链
        filename: ... # 保存有证书信息的文件; 也可使用inline_bytes或inline_string进行指定, 即DataSource格式;
    private_key: {...} # TLS私钥, 遵循DataSource格式;
    password: {...} # 私钥信息的加解密密钥, 未指定时需要私钥文件处于未加密状态, 遵循DataSource格式;
  - name: ... # 可用于引用此秘密的惟一标识;
    session_ticket_keys: {...} # 定义用于加密和解密TLS会话票证的密钥
      keys: [] # 密钥列表, 未指定时将使用内部生成和管理的密钥, 定义格式遵循DataSource格式;
      #安全起见, 应该每小时轮换一次, 但使用安全的随机数据源;
  - name: ... # 可用于引用此秘密( Secret) 的惟一标识;
    validation_context: {...} # 对等证书验证机制的相关配置
      trusted_ca: {...} # 信任的CA的证书, 未指定时不会验证对端证书;
      crl: {...} # 可选的PEM格式的证书吊销列表, 定义格式遵循DataSource格式;
      verify_certificate_spki: [] # base64编码的SHA-256哈希码, 用于验证DER编码枨证书的公钥信息的SHA-256编码是否与列表项之一匹配
      verify_certificate_hash: [] # base64编码的SHA-256哈希码, 用于验证DER编码格式证书的SHA-256编码是否与列表项之一匹配
      verify_subject_alt_name: [] # Subject备用名称列表, 可选, 用于验证证书的主题备用名称是否与列表项之一匹配
      allow_expired_certificate: ... # 布尔型数据, 用于定义是滞不会拒绝过期的证书

TLS Context:

        auth.DownstreamTlsContext, 定义在listener中, 它支持三种定义格式

1、直接在listener的tls_context中通过tls_certificates参数定义;

2、在static_resource上下文定义secret, 而后在listener的tls_context中直接通过tls_certificate_sds_secret_configs参数引用;

3、直接在listener的tls_context中通过tls_certificate_sds_secret_configs参数的sds_config指定通过SDSAPI获取。

static_resources:
  listeners: []
  clusters: []
  secrets: [] # 静态指定的Secret列表, 定义时, 以下三种方式可选其一;
  - name: ... # 可用于引用此秘密( Secret) 的惟一标识;
    tls_cretificate: {...} # 数字证书
      certificate_chain: {...} # TLS证书链
        filename: ... # 保存有证书信息的文件; 也可使用inline_bytes或inline_string进行指定, 即DataSource格式;
    private_key: {...} # TLS私钥, 遵循DataSource格式;
    password: {...} # 私钥信息的加解密密钥, 未指定时需要私钥文件处于未加密状态, 遵循DataSource格式;
  - name: ... # 可用于引用此秘密的惟一标识;
    session_ticket_keys: {...} # 定义用于加密和解密TLS会话票证的密钥
      keys: [] # 密钥列表, 未指定时将使用内部生成和管理的密钥, 定义格式遵循DataSource格式;
      #安全起见, 应该每小时轮换一次, 但使用安全的随机数据源;
  - name: ... # 可用于引用此秘密( Secret) 的惟一标识;
    validation_context: {...} # 对等证书验证机制的相关配置
      trusted_ca: {...} # 信任的CA的证书, 未指定时不会验证对端证书;
      crl: {...} # 可选的PEM格式的证书吊销列表, 定义格式遵循DataSource格式;
      verify_certificate_spki: [] # base64编码的SHA-256哈希码, 用于验证DER编码枨证书的公钥信息的SHA-256编码是否与列表项之一匹配
      verify_certificate_hash: [] # base64编码的SHA-256哈希码, 用于验证DER编码格式证书的SHA-256编码是否与列表项之一匹配
      verify_subject_alt_name: [] # Subject备用名称列表, 可选, 用于验证证书的主题备用名称是否与列表项之一匹配
      allow_expired_certificate: ... # 布尔型数据, 用于定义是滞不会拒绝过期的证书

TLS Context:

        auth.UpstreamTlsContext , 定义在cluster中, 与集群中的主机通信时使用,它同样支持类似listener的tls_context一样的三种定义格式。

clusters:
  - name: ...
  ...
    tls_context: {...} # 当前过滤器的TLS上下文;
      tls_params: {...} # TLS协议版本和密码套件等;
      tls_certificates: [] # TLS证书列表;
        certificate_chain: {...} # TLS证书链;
          filename: ... # 保存有证书信息的文件; 也可使用inline_bytes或inline_string进行指定, 即DataSource格式;
        private_key: {...} # TLS私钥;
        password: {...} # 解密私钥文件的口令, 未指定时需要私钥文件处于未加密状态;
      tls_certificate_sds_secret_configs: {...} # 通过静态资源中定义的Secret或SDS获取Secret;
        name: ... # secret的惟一标识, 可以FQDN、 UUID、 SPKI或SHA256格式; 仅指定name时, 表示加载static_resources中定义的secret;
        sds_config: {...} # xDS API ConfigSource, 支持path、 api_config_source或ads格式;
      validation_context: {...} # 如何验证对等证书
      validation_context_sds_secret_config: {...} # 通过SDS获取验证上下文;
    allow_renegotiation: ... # 布尔型值, 是否允许服务器启动的TLS重新协商; 、
    max_session_key: ... # 为会话恢复而存储的最大会话密钥数, 默认为1, 0表示禁用会话恢复;
    sni: ... # 创建TLS后端连接时使用的SNI字符串

示例:

admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

static_resources:
  secrets: # 预先定义secret以供后面使用
  - name: server_cert
    tls_certificate: # 作为服务端时用的证书
      certificate_chain:
        filename: "/etc/envoy/certs/server.crt"
      private_key:
        filename: "/etc/envoy/certs/server.key"
  - name: client_cert
    tls_certificate: # 服务端要验证客户端身份时的证书
      certificate_chain:
        filename: "/etc/envoy/certs/client.crt"
      private_key:
        filename: "/etc/envoy/certs/client.key"
  - name: validation_context
    validation_context: # 用来认证被请求的服务端,upstream
      trusted_ca:
        filename: "/etc/envoy/ca/ca.crt"

  listeners:
  - name: listener_http
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          codec_type: AUTO
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                redirect:
                  https_redirect: true
                  port_redirect: 443
          http_filters:
          - name: envoy.router
            typed_config: {}
  - name: listener_https
    address:
      socket_address: { address: 0.0.0.0, port_value: 443 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          stat_prefix: ingress_https
          codec_type: AUTO
          route_config:
            name: https_route
            virtual_hosts:
            - name: https_route
              domains: ["*"]
              routes:
              - match:
                  prefix: "/service/gray"
                route:
                  cluster: service-gray
              - match:
                  prefix: "/service/purple"
                route:
                  cluster: service-purple
              - match:
                  prefix: "/"
                route:
                  cluster: mycluster
          http_filters:
          - name: envoy.router
            typed_config: {}
      tls_context: # 作为服务端的证书
        common_tls_context:
          tls_certificate_sds_secret_configs:
          - name: server_cert

  clusters:
  - name: mycluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: mycluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: myservice
                port_value: 80

  - name: service-gray
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: service-gray
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service-gray
                port_value: 443
    tls_context: # 这个集群需要加密通信来访问443端口,需要ca.crt来验证所访问服务端的正确性
      common_tls_context:
        validation_context_sds_secret_config:
          name: validation_context

  - name: service-purple
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: service-purple
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service-purple
                port_value: 443
    tls_context: # 这个集群需要双向认证,既需要提供作为客户端时的客户端证书,也需要验证服务端身份的ca.crt证书
      common_tls_context:
        tls_certificate_sds_secret_configs:
        - name: client_cert
        validation_context_sds_secret_config:
          name: validation_context