TLS

Envoy 同时支持监听器中的 TLS 终止和与上游集群建立连接时的 TLS 发起。不管是为现代 web 服务提供标准的边缘代理功能,还是同具有高级 TLS 要求(TLS1.2, SNI, 等等)的外部服务建立连接,Envoy 都提供了充分的支持。Envoy 支持以下的 TLS 特性:

  • 加密可配置: 每个 TLS 监听器和客户端都可以指定它支持的加密算法。
  • 客户端证书: 除服务器证书验证外,上游/客户端连接还可以提供一个客户端证书。
  • 证书验证和固定: 证书验证选项包括基本的证书链验证、Subject 名称验证和哈希固定。
  • 证书撤销: 如果提供了证书撤销列表(CRL),Envoy 可以根据它检查对等证书。
  • ALPN: TLS 监听器支持 ALPN. HTTP 连接管理器使用这个信息(以及协议接口)来确定客户端使用的是 HTTP/1.1 还是 HTTP/2.
  • SNI: SNI 同时支持服务端(监听器)连接和客户端(上游)连接。
  • 会话恢复: 服务器连接支持通过 TLS 会话票据恢复之前的会话(参见RFC 5077)。可以在热重启时和并行 Envoy 实例之间执行恢复(通常在前端代理配置中很有用)。

底层实现

目前 Envoy 被编写为使用 BoringSSL 作为 TLS 提供者。

启用证书验证

除非验证上下文指定了一个或多个可信授权证书,否则上游和下游连接的证书验证都不会启用。

配置示例

  1. static_resources:
  2. listeners:
  3. - name: listener_0
  4. address: { socket_address: { address: 127.0.0.1, port_value: 10000 } }
  5. filter_chains:
  6. - filters:
  7. - name: envoy.http_connection_manager
  8. # ...
  9. tls_context:
  10. common_tls_context:
  11. validation_context:
  12. trusted_ca:
  13. filename: /usr/local/my-client-ca.crt
  14. clusters:
  15. - name: some_service
  16. connect_timeout: 0.25s
  17. type: STATIC
  18. lb_policy: ROUND_ROBIN
  19. hosts: [{ socket_address: { address: 127.0.0.2, port_value: 1234 }}]
  20. tls_context:
  21. common_tls_context:
  22. validation_context:
  23. trusted_ca:
  24. filename: /etc/ssl/certs/ca-certificates.crt

/etc/ssl/certs/ca-certificates.crt 是 Debian 系统上 CA 包文件的默认路径。它使得 Envoy 在验证 127.0.0.2:1234 的服务器身份时,使用与标准安装的 Debian 系统上的 cURL 等相同的方式。Linux 和 BSD 系统上常见的系统 CA 包文件路径有

  • /etc/ssl/certs/ca-certificates.crt (Debian/Ubuntu/Gentoo etc.)
  • /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem (CentOS/RHEL 7)
  • /etc/pki/tls/certs/ca-bundle.crt (Fedora/RHEL 6)
  • /etc/ssl/ca-bundle.pem (OpenSUSE)
  • /usr/local/etc/ssl/cert.pem (FreeBSD)
  • /etc/ssl/cert.pem (OpenBSD)

对于其他的 TLS 选项,请参见 UpstreamTlsContextsDownstreamTlsContexts 的参考手册。

身份验证过滤器

Envoy 提供了一个网络过滤器,通过从 REST VPN 服务拉取的主体来进行 TLS 客户端身份验证。此过滤器将提供的客户端证书哈希与主体列表进行匹配,以确定是否允许连接。另外也可以配置一个可选的 IP 白名单。此功能可用于为 Web 基础架构构建边缘代理 VPN 支持。

这里是客户端 TSL 验证过滤器的配置参考