Envoy 怎么配置 TLS 加密下游流量并验证上游服务证书
2026/9/12 16:10:11 网站建设 项目流程

Envoy 怎么配置 TLS 加密下游流量并验证上游服务证书

【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy

在把 Envoy 用作代理时,常见的需求是:客户端(下游)到 Envoy 的链路要走 TLS 加密,同时 Envoy 连接后端服务(上游)时不仅要建立 TLS 连接,还要真正校验对端证书是否可信。官方文档 Securing Envoy 用两个 TLS context 完成这件事:在 listener 上配置DownstreamTlsContext加密下游流量,在 cluster 上配置UpstreamTlsContext并附加validation_context校验上游证书。本文按这条路径走一遍静态配置的完整写法,并给出文档中提供的验证方式。

准备条件

根据文档,需要准备三类证书文件(示例配置中使用相对路径certs/目录):

  • certs/servercert.pem:下游 listener 使用的服务器证书链;
  • certs/serverkey.pem:对应的私钥;
  • certs/cacert.pem:用于校验上游服务证书的受信任 CA。

文档明确说明"You will also need to provide valid certificates",但快速入门部分没有给出证书生成步骤,需要你自行准备有效的证书与 CA 文件。另外,文档特别提示:确保证书链的完整性由你负责(It is your responsibility to ensure the integrity of your certificate chain),这属于配置之外的工作。

Envoy 本身可通过系统安装或 Docker 镜像运行,运行方式见 Run Envoy。

配置下游 TLS:在 listener 上加 DownstreamTlsContext

连接到 Envoy 的机器在 Envoy 眼中是 "downstream"。要让这些客户端通过 TLS 连接,需要在 listener 的filter_chains中设置transport_socket,类型为envoy.transport_sockets.tls,内容是一个DownstreamTlsContext

以仓库中的示例配置 envoy-demo-tls.yaml 为例,listener 监听0.0.0.0:10000,关键部分是 filter chain 末尾的transport_socket

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: certs/servercert.pem private_key: filename: certs/serverkey.pem

tls_certificates提供 listener 对外出示的证书链和私钥。这个示例的 listener 同时配置了http_connection_manager和路由(全部路径转发到service_envoyproxy_iocluster),TLS 配置与 HTTP 路由互不冲突。

配置上游 TLS:在 cluster 上加 UpstreamTlsContext

Envoy 连接 TLS 上游服务时,做法是在 cluster 的transport_socket中放置UpstreamTlsContext。示例 cluster 使用LOGICAL_DNS类型解析www.envoyproxy.io:443

clusters: - name: service_envoyproxy_io type: LOGICAL_DNS dns_lookup_family: V4_ONLY load_assignment: cluster_name: service_envoyproxy_io endpoints: - lb_endpoints: - endpoint: address: socket_address: address: www.envoyproxy.io port_value: 443 transport_socket: name: envoy.transport_sockets.tls typed_config: "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext

dns_lookup_family: V4_ONLY用于在不支持 IPv6 的环境(例如非 Linux 宿主上的 Docker)中禁用 IPv6,这是 demo 配置中的既有写法。只到这一步,Envoy 已经能建立到上游的 TLS 连接,但默认不会校验上游出示的证书——这正是下面一节要补上的。

校验上游服务证书:validation_context

Securing Envoy 的 "Validate an endpoint's certificates when connecting" 一节说明:默认情况下 Envoy 连接上游 TLS 服务时不校验证书,需要显式配置validation_context来指定校验方式。校验分两层:

  1. CA 信任:通过trusted_ca指认受信任的 CA,确保证书来自双方都信任的证书颁发机构;
  2. SAN 匹配:确保证书的 Subject Alternative Names(SAN)与目标服务匹配。

示例文件 envoy-demo-tls-validation.yaml 中 cluster 的UpstreamTlsContext完整写法如下:

transport_socket: name: envoy.transport_sockets.tls typed_config: "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext common_tls_context: validation_context: trusted_ca: filename: certs/cacert.pem match_typed_subject_alt_names: - san_type: DNS matcher: exact: proxy-postgres-backend.example.com

需要注意:match_typed_subject_alt_names中的exact: proxy-postgres-backend.example.com是文档示例值,必须替换为你要连接的上游服务证书中实际的 DNS SAN,否则校验会失败。

如果不想逐个手写 SAN,文档提供了两种自动匹配选项:

  • UpstreamTlsContext上开启auto_sni_san_validation,让证书必须含有与发送的 SNI 匹配的 SAN,此时可以省略match_typed_subject_alt_names
  • UpstreamHttpProtocolOptions上开启auto_san_validation,让证书 SAN 与下游请求的host:authority头匹配。

当多种校验方式同时配置时,优先级为:auto_san_validation最高,其次是auto_sni_san_validation,最后是match_typed_subject_alt_names。所有可用的校验配置字段见CertificateValidationContext的 API 文档(securing.rst 中有指引)。

启动并验证

文档提供了两级验证方式。

第一级:配置校验。--mode validate以校验模式启动,它会检查 Envoy 能否用该配置启动,但不实际启动服务、不建立网络连接:

$ envoy --mode validate -c envoy-demo-tls.yaml

配置有效时进程输出OK并以返回码0退出;配置无效时输出错误信息并以1退出。文档给出的成功输出形如configuration 'my-envoy-config.yaml' OK(文档示例)。

第二级:实际运行。校验通过后正式启动:

$ envoy -c envoy-demo-tls.yaml

-c--config-path指定初始配置文件路径,Envoy 按文件扩展名解析配置。快速入门文档中用如下方式确认 Envoy 正在 10000 端口代理:

$ curl -v localhost:10000

注意:本示例的 listener 已配置 TLS,客户端对该端口的请求需要走 https 连接,而不是快速入门 demo(无 TLS listener)中的明文 http。

如果使用 Docker 运行,需要把配置文件和certs/证书目录挂载进容器,并用-c指定容器内路径,例如把宿主机当前目录的配置挂到/envoy-demo-tls.yaml后以-c /envoy-demo-tls.yaml启动(文档中的镜像名使用了|envoy_docker_image|替换变量,需替换为实际的 Envoy 镜像标签)。

限制与可选分支

  • 文档建议在可以控制连接两端的情况下尽量使用加密加双向认证;如果你还需要让 Envoy 校验客户端证书(mTLS),在DownstreamTlsContext中设置require_client_certificate并指定受信任 CA,详见 securing.rst 的 "Use mutual TLS (mTLS)" 一节。
  • 需要在同一 IP 上用 SNI 提供多个 TLS 域、或连接上游时指定 SNI 的场景,同样在该文档的 SNI 小节有配置示例(listener 的filter_chain_match、上游的sni/auto_sni/auto_host_sni,优先级为auto_sni>auto_host_sni> 固定sni)。
  • 证书链完整性、CA 的运维与轮换不在本文档范围内,需要自行保证。

【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询