搭配邊緣使用 SNI

您正在查看 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

伺服器名稱指示 (SNI) 可讓多個 HTTPS 目標透過相同的 IP 位址和通訊埠提供服務,而不需要這些目標使用相同的 TLS 憑證。在用戶端啟用 SNI 後,用戶端會在初始 TLS 握手期間傳遞目標端點的主機名稱。這可讓 TLS 伺服器決定應使用哪個 TLS 憑證來驗證要求。

舉例來說,如果要求目標是 https://example.com/request/path,則 TLS 用戶端會在 TLS 握手要求中加入 server_name 擴充功能,如下所示:

Edge 支援下列項目的 SNI:

  • 從用戶端應用程式傳送至 API Proxy 的要求。在這種情況下,Edge 會充當 TLS 伺服器
  • Edge 傳送至後端的要求。在這種情況下,Edge 會充當 TLS 用戶端。

如要進一步瞭解 SNI,請參閱:

支援 Edge 上 API Proxy 要求的 SNI

針對 API Proxy 要求的 SNI 支援功能,由主機別名和虛擬主機控制。

關於虛擬主機和主機別名

在 Edge 中,虛擬主機會定義 IP 位址和通訊埠,或 DNS 名稱和通訊埠,並在這些位置公開 API 代理程式,進而擴充應用程式用來存取 API 代理程式的網址。IP 位址/DNS 名稱對應至 Edge Router,而通訊埠號碼則是 Router 上的開放通訊埠。

建立虛擬主機時,您也需要指定虛擬主機的主機別名。通常是虛擬主機的 DNS 名稱。在決定要處理要求的 API proxy 時,路由器會將傳入要求的 Host 標頭,與所有虛擬主機定義的可用主機別名清單進行比較。

虛擬主機的主機別名和通訊埠編號組合,在 Edge 安裝環境中的所有虛擬主機中不得重複。也就是說,如果有多個虛擬主機使用不同的主機別名,這些虛擬主機可以使用相同的通訊埠編號

虛擬主機也會定義 API Proxy 是使用 HTTP 通訊協定,還是使用 TLS 加密的 HTTPS 通訊協定存取。將虛擬主機設定為使用 HTTPS 時,請將虛擬主機與金鑰庫建立關聯,該金鑰庫包含虛擬主機在 TLS 握手期間使用的憑證和私密金鑰。

如要進一步瞭解虛擬主機,請參閱:

SNI 如何與主機別名搭配運作

透過 SNI,您可以在同一個通訊埠上定義多個虛擬主機,每個虛擬主機都有不同的 TLS 憑證和金鑰。接著,Edge 會根據 TLS 握手要求中的 server_name 擴充功能,判斷 TLS 使用的虛擬主機和憑證/金鑰組。

Edge Router 會讀取 TLS 握手要求中的 server_name 擴充功能,然後根據該擴充功能搜尋所有虛擬主機的主機別名。如果路由器偵測到與主機別名相符的項目,就會使用與主機別名相關聯的虛擬主機中的 TLS 憑證和金鑰。如果找不到相符項目,TLS 握手就會失敗。

您可以定義預設的憑證/金鑰組,避免 TLS 握手失敗,如後續章節所述。

在 Edge 中定義 Cloud 的預設憑證/金鑰組合

Apigee 會提供 TLS 憑證和私密金鑰,以支援 HTTPS。雖然許多客戶在部署時偏好使用自己的憑證和私密金鑰,但您也可以使用 Apigee 憑證和金鑰部署 API。

在 Edge for Cloud 中,如果路由器無法將 SNI 標頭與主機別名配對,或是用戶端不支援 SNI,路由器就會使用 Apigee 提供的預設憑證,也就是 *.apigee.net。

在 Edge for Private Cloud 中定義預設憑證/金鑰組

在私有雲端的 Edge 中,如果 server_name 擴充功能與所有虛擬主機的主機別名不相符,或是要求的用戶端不支援 SNI,您可以設定 Router 使用通訊埠上預設虛擬主機的憑證/金鑰。預設虛擬主機是由機構名稱、環境名稱和虛擬主機名稱組合而成,格式如下:

orgName_envName_vhName

路由器會使用 orgName_envName_vhName 組合中排在字母順序最前面的憑證/金鑰。舉例來說,要求會透過通訊埠 443 傳入,且在環境 prod 中為組織 example 定義了兩個虛擬主機:

  • 虛擬主機名稱 = default
  • 虛擬主機名稱 = test

在本例中,路由器會使用名為 default 的虛擬主機的憑證/金鑰,因為 example_prod_default 在字母順序上排在 example_prod_test 之前。

如要啟用預設虛擬主機,請按照下列步驟操作:

  1. 在第一個 Router 節點上編輯 /opt/apigee/customer/application/router.properties。如果該檔案不存在,請建立該檔案。
  2. 將下列屬性新增至檔案,即可定義預設的虛擬主機:
    conf_load_balancing_load.balancing.driver.nginx.fallback.conf.enabled=true
  3. 重新啟動路由器:
    /opt/apigee/apigee-service/bin/apigee-service edge-router restart
  4. 針對所有剩餘的路由器重複執行這些步驟。

您可以明確在 Router 上定義預設憑證/金鑰,而非使用預設虛擬主機的憑證/金鑰。請按照下列程序定義明確的預設憑證/金鑰組合:

  1. 在第一個 Router 節點上,將憑證和私密金鑰複製到 Router 節點中 apigee 使用者可存取的位置。例如 /opt/apigee/customer/application
  2. 將檔案的擁有權變更為「apigee. user:
    chown apigee:apigee /opt/apigee/customer/application/myCert.pem
    chown apigee:apigee /opt/apigee/customer/application/myKey.pem
  3. 編輯 /opt/apigee/customer/application/router.properties。如果該檔案不存在,請建立該檔案。
  4. 將下列屬性新增至檔案,即可指定預設的憑證/金鑰:
    conf_load_balancing_load.balancing.driver.nginx.fallback.server.default.ssl.template.enabled=true
    conf_load_balancing_load.balancing.driver.nginx.fallback.conf.enabled=true
  5. router.properties 中設定下列屬性,指定憑證和金鑰的位置:
    conf_load_balancing_load.balancing.driver.nginx.ssl.cert=/opt/apigee/customer/application/myCert.pem
    conf_load_balancing_load.balancing.driver.nginx.ssl.key=/opt/apigee/customer/application/myKey.pem
  6. 重新啟動路由器:
    /opt/apigee/apigee-service/bin/apigee-service edge-router restart
  7. 針對所有剩餘的路由器重複執行這些步驟。

支援從 Edge 傳送至後端的要求的 SNI

Edge 支援使用來自訊息處理器的 SNI,以便在 Apigee Edge for Cloud 和 Private Cloud 部署中指定端點。根據預設,系統會在雲端的 Edge Message Processor 上啟用 SNI,並在私有雲中停用。

在 Private Cloud 的 Edge 中使用 SNI 連線至後端

針對私有雲端的 Edge,為了與現有目標後端相容,Apigee 預設會停用 SNI。如果目標後端已設定為支援 SNI,您可以按照下文所述,為 Edge 的版本啟用這項功能。

不需要其他 Edge 專屬設定。如果目標環境已針對 SNI 進行設定,Edge 就會支援 SNI。Edge 會自動從要求網址中擷取主機名稱,並將其新增至 TLS 握手要求。

在 Edge 4.15.07.0x 版本中,在 Edge 和後端之間啟用 SNI

請按照下列程序啟用 SNI:

  1. 在第一個 Message Processor 節點上,在編輯器中開啟檔案 /opt/apigee4/conf/apigee/message-processor/system.properties
  2. system.properties 中將下列屬性設為 true:
    jsse.enableSNIExtension=true
  3. 重新啟動訊息處理工具:
    /opt/apigee4/bin/apigee-service message-processor restart
  4. 針對所有剩餘的 Message Processor 重複執行這些步驟。

在 Edge 4.16.01 以上版本中,啟用 Edge 與後端之間的 SNI

請按照下列程序啟用 SNI:

  1. 在第一個 Message Processor 節點上,編輯 /opt/apigee/customer/application/message-processor.properties。 如果該檔案不存在,請建立該檔案。
  2. 在檔案中新增下列屬性:
    conf_system_jsse.enableSNIExtension=true
  3. 重新啟動訊息處理器:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
  4. 針對所有剩餘的訊息處理工具重複執行這些步驟。