傳輸層安全性 (TLS)

此範例逐步說明如何設定 Envoy 以利用透過 TLS 的加密連線來使用 HTTP

它展示了一些常用的代理和 TLS 終止模式

  • https -> http

  • https -> https

  • http -> https

  • https 直通

為了更好地了解提供的範例,以及有關如何使用 Envoy 配置 TLS 的說明,請參閱保護 Envoy 快速入門指南

警告

為了簡單起見,此處提供的範例不會驗證任何用戶端憑證,也不會驗證任何提供的憑證。

使用 TLS 時,強烈建議您在任何可能的情況下驗證所有憑證。

在您控制連線的兩端,或者可以使用相關協定時,您也應該驗證用戶端

步驟 1:建立沙箱

將目錄變更為 Envoy 儲存庫中的 examples/tls

這會啟動四個監聽 localhost 連接埠 10000-10003 的代理。

它還會啟動兩個上游服務,一個是 HTTP,另一個是 HTTPS,它們以 json 格式回傳收到的標頭。

上游服務分別在 80443 連接埠上的內部 Docker 網路中監聽。

$ 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 transport_socket新增至監聽器

查詢連接埠 10000 上的服務時,您應該會看到已新增 httpsx-forwarded-proto 標頭

$ 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 transport_socket新增至監聽器叢集

查詢連接埠 10001 上的服務時,您應該會看到已新增 httpsx-forwarded-proto 標頭

$ 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 transport_socket新增至叢集

查詢連接埠 10002 上的服務時,您應該會看到已新增 httpx-forwarded-proto 標頭

$ 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 流量,透過驗證和相互驗證來保護代理之間流量的範例。