传输层安全 (TLS)

此示例介绍了 Envoy 可以配置为使用通过 TLSHTTP 建立加密连接的几种方式。

它演示了许多常用的代理和 TLS 终止模式

  • https -> http

  • https -> https

  • http -> https

  • https 直通

为了更好地理解提供的示例,以及有关如何使用 Envoy 配置 TLS 的描述,请参阅 保护 Envoy 快速入门指南

警告

为了简单起见,此处提供的示例不验证任何客户端证书,也不验证任何提供的证书。

在使用 TLS 时,强烈建议您尽可能 验证 所有证书。

您还应该 验证客户端,前提是您控制连接的双方,或可以使用相关协议。

步骤 1:构建沙盒

更改 Envoy 存储库中 examples/tls 的目录。

这将启动四个代理,侦听 localhost 端口 10000-10003

它还启动两个上游服务,一个 HTTP 和一个 HTTPS,它们以 json 格式回显接收到的标头。

上游服务在内部 Docker 网络上分别侦听端口 80443

$ pwd
envoy/examples/tls
$ docker compose pull
$ docker compose up --build -d
$ docker compose ps

       Name                            Command                 State          Ports
-----------------------------------------------------------------------------------------------
tls_proxy-https-to-http_1       /docker-entrypoint.sh /usr ... Up      0.0.0.0:10000->10000/tcp
tls_proxy-https-to-https_1      /docker-entrypoint.sh /usr ... Up      0.0.0.0:10001->10000/tcp
tls_proxy-http-to-https_1       /docker-entrypoint.sh /usr ... Up      0.0.0.0:10002->10000/tcp
tls_proxy-https-passthrough_1   /docker-entrypoint.sh /usr ... Up      0.0.0.0:10003->10000/tcp
tls_service-http_1              node ./index.js                Up
tls_service-https_1             node ./index.js                Up

步骤 2:测试代理 https -> http

侦听 https://127.0.0.1:10000 的 Envoy 代理终止 HTTPS 并代理到上游 HTTP 服务。

https -> http 配置传输套接字 中添加了 TLS。 到 监听器

查询端口 10000 上的服务,您应该看到添加了 x-forwarded-proto 标头,其值为 https

$ curl -sk https://127.0.0.1:10000  | jq -r '.headers["x-forwarded-proto"]'
https

上游 service-http 处理请求。

$ curl -sk https://127.0.0.1:10000  | jq -r '.os.hostname'
service-http

步骤 3:测试代理 https -> https

侦听 https://127.0.0.1:10001 的 Envoy 代理终止 HTTPS 并代理到上游 HTTPS 服务。

https -> https 配置传输套接字 中添加了 TLS。 到 监听器集群

查询端口 10001 上的服务,您应该看到添加了 x-forwarded-proto 标头,其值为 https

$ curl -sk https://127.0.0.1:10001  | jq -r '.headers["x-forwarded-proto"]'
https

上游 service-https 处理请求。

$ curl -sk https://127.0.0.1:10001  | jq -r '.os.hostname'
service-https

步骤 4:测试代理 http -> https

侦听 https://127.0.0.1:10002 的 Envoy 代理终止 HTTP 并代理到上游 HTTPS 服务。

http -> https 配置传输套接字 中添加了 TLS。 到 集群

查询端口 10002 上的服务,您应该看到添加了 x-forwarded-proto 标头,其值为 http

$ curl -s https://127.0.0.1:10002  | jq -r '.headers["x-forwarded-proto"]'
http

上游 service-https 处理请求。

$ curl -s https://127.0.0.1:10002  | jq -r '.os.hostname'
service-https

步骤 5:测试代理 https 直通

侦听 https://127.0.0.1:10003 的 Envoy 代理直接代理到上游 HTTPS 服务,该服务执行 TLS 终止。

https 直通 配置 不需要任何 TLSHTTP 设置,而是使用简单的 tcp_proxy

查询端口 10003 上的服务,您应该看到没有添加 x-forwarded-proto 标头

$ curl -sk https://127.0.0.1:10003  | jq -r '.headers["x-forwarded-proto"]'
null

上游 service-https 处理请求。

$ curl -sk https://127.0.0.1:10003  | jq -r '.os.hostname'
service-https

另请参阅

保护 Envoy 快速入门指南

保护 Envoy 的关键概念概述。

TLS SNI 沙盒

使用 Envoy 为多个域提供服务的示例,这些域受 TLS 保护并从同一 IP 地址提供服务。

双代理沙盒

使用 mTLS 和非 HTTP 流量在代理之间保护流量的示例,该示例使用验证和相互身份验证。