啟用非 SNI 用戶端

本主題說明如何啟用非 SNI 用戶端,以便搭配 Apigee Hybrid 使用。

如何設定非 SNI 用戶端

本節說明如何在 Apigee Hybrid 中,為非 SNI (伺服器名稱指示) 用戶端啟用支援功能。

SNI 定義 TLS 對等互連 (用戶端) 在初始 TLS 握手期間,指定要連線的主機名稱的方式。SNI 自 2003 年起就屬於 TLS 的一部分。在 SNI 之前,當 TLS 對等互連裝置傳送 HELLO 來啟動握手程序時,接收端對等互連裝置一律會以相同的憑證回應。導入 SNI 是為了讓單一負載平衡器支援多個不同的主機名稱和憑證集,以管理 TLS 連線。現在大多數的 TLS 用戶端都使用 SNI。

但也有例外狀況。舉例來說,Google Cloud 負載平衡器會使用非 SNI 交握連線至後端。

如果您想設定 Apigee Hybrid,以便處理未使用 SNI 的 TLS 握手,可能是因為 Apigee Hybrid 是 Google Cloud Load Balancer 的後端,或是 Apigee Hybrid 必須支援其他非 SNI 用戶端,請按照下列步驟操作。非 SNI 協商會做為備用機制,Apigee Hybrid 會將其用於未使用 SNI 的任何用戶端。

  1. 建立 ApigeeRoute 資源。 請務必將 enableNonSniClient 設為 true
    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: ApigeeRoute
    metadata:
      name: ROUTE_NAME
      namespace: APIGEE_NAMESPACE
    spec:
      hostnames:
      - "*"
      ports:
      - number: 443
        protocol: HTTPS
        tls:
          credentialName: CREDENTIAL_NAME
          mode: SIMPLE
          #optional
          minProtocolVersion: TLS_AUTO
      selector:
        app: apigee-ingressgateway
      enableNonSniClient: true

    其中:

    • ROUTE_NAME 是您為自訂資源 (CR) 提供的名稱。
    • CREDENTIAL_NAME 是部署至叢集的 Kubernetes 密鑰名稱,其中包含虛擬主機的 TLS 憑證。您可以使用下列 kubectl 指令找出憑證名稱:
      kubectl -n APIGEE_NAMESPACE get ApigeeRoutes -o=yaml | grep credentialName
    • hostnames 必須設為萬用字元「*」。
  2. 開啟覆寫檔案,然後進行下一個步驟所述的變更。
  3. 針對每個環境群組,將 ApigeeRoute 名稱新增至 additionalGateways 屬性。例如:
    virtualhosts:
      - name: default
        sslCertPath: ./certs/fullchain.pem
        sslKeyPath: ./certs/privkey.pem
        additionalGateways: ["ROUTE_NAME"]
  4. 儲存 CRD 檔案。例如:ApigeeRoute.yaml
  5. 將 CRD 套用至叢集:
    kubectl apply -f ApigeeRoute.yaml -n APIGEE_NAMESPACE
  6. 將變更套用至「virtualhosts」。如果您已在殼層中設定 $ENV_GROUP 環境變數,可以在下列指令中使用該變數:
    helm upgrade $ENV_GROUP apigee-virtualhost/ \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      --set envgroup=$ENV_GROUP \
      -f OVERRIDES_FILE.yaml
    

使用須知

  • 如果叢集有多個機構,會發生什麼情況?

    由於特定連接埠 (443) 的 Ingress 位於叢集層級,且 ApigeeRoute CRD 只能有一組金鑰/憑證,因此所有機構都必須共用同一組金鑰/憑證。

  • 如果叢集有多個環境群組,會發生什麼事?如果虛擬主機共用同一組金鑰/憑證,是否會正常運作?

    所有環境群組中的所有主機名稱都必須使用相同的金鑰/憑證組合。

  • 為什麼要建立 ApigeeRoute,而不是 Gateway?

    Apigee 可以驗證 ApigeeRoutes,但無法驗證 Gateway (Istio CRD)。從技術上來說,即使是 Gateway 也能運作,但我們可以透過驗證 Webhook 避免潛在的設定錯誤。

  • 如何為 Apigee 設定非 SNI 用戶端?

    如果您的 Apigee 執行個體是透過 Google 負載平衡器公開,則負載平衡器支援非 SNI 用戶端,如負載平衡說明文件所述。否則,如果您透過內部 PSC 端點或虛擬私有雲公開 Apigee 執行個體,Apigee 執行個體預設會支援非 SNI 用戶端。