TLS/SSL 握手失敗

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

問題

如果用戶端和伺服器無法使用 TLS/SSL 通訊協定建立通訊,就會發生 TLS/SSL 握手失敗。在 Apigee Edge 中發生這項錯誤時,用戶端應用程式會收到 HTTP 狀態 503,並顯示「Service Unavailable」(服務無法使用) 訊息 。如果 API 呼叫發生傳輸層安全標準 (TLS)/安全通訊端層 (SSL) 握手失敗,就會看到這項錯誤。

錯誤訊息

HTTP/1.1 503 Service Unavailable

如果發生 TLS/SSL 握手失敗的情況,您也可能會看到這則錯誤訊息:

Received fatal alert: handshake_failure

可能原因

TLS (傳輸層安全標準,前身為 安全資料傳輸層:SSL) 是標準安全技術,用於在網路伺服器和網頁用戶端 (例如瀏覽器或應用程式) 之間建立已加密連結。握手程序可讓 傳輸層安全標準:TLS/安全資料傳輸層:SSL 用戶端和伺服器建立一組私密金鑰,以便進行通訊。在這項程序中,用戶端和伺服器會執行下列動作:

  1. 同意要使用的通訊協定版本。
  2. 選取要使用的加密演算法。
  3. 交換並驗證數位憑證,相互驗證身分。

如果 TLS/SSL 握手成功,TLS/SSL 用戶端和伺服器就會彼此安全地傳輸資料。否則,如果發生 TLS/SSL 交握失敗,連線會終止,且用戶端會收到 503 Service Unavailable 錯誤。

TLS/SSL 握手失敗的可能原因如下:

原因 說明 誰可以執行疑難排解步驟
通訊協定不符 伺服器不支援用戶端使用的通訊協定。 私有雲和公有雲使用者
加密套件不符 伺服器不支援用戶端使用的加密套件。 私有雲和公有雲使用者
憑證不正確 用戶端使用的網址中的主機名稱,與伺服器端儲存的憑證中的主機名稱不符。 私有雲和公有雲使用者
用戶端或伺服器端儲存的憑證鏈結不完整或無效。 私有雲和公有雲使用者
用戶端傳送給伺服器或伺服器傳送給用戶端的憑證不正確或已過期。 私有雲和公有雲使用者
已啟用 SNI 的伺服器 後端伺服器已啟用伺服器名稱指示 (SNI),但用戶端無法與 SNI 伺服器通訊。 僅限私有雲使用者

通訊協定不符

如果用戶端使用的通訊協定在傳入 (北向) 或傳出 (南向) 連線中,不支援伺服器,就會發生 TLS/SSL 交握失敗。另請參閱「 瞭解北向和南向連線」。

診斷

  1. 判斷錯誤是發生在北向南向連線。如需進一步瞭解如何判斷問題來源,請參閱「 判斷問題來源」。
  2. 執行 tcpdump 公用程式,收集更多資訊:
    • 如果您是私有雲使用者,可以在相關用戶端或伺服器收集 tcpdump 資料。用戶端可以是用戶端應用程式 (適用於連入或北向連線),也可以是訊息處理器 (適用於連出或南向連線)。根據步驟 1 的判斷結果,伺服器可以是邊緣路由器 (適用於連入或北向連線),也可以是後端伺服器 (適用於連出或南向連線)。
    • 如果您是公有雲使用者,則只能在用戶端應用程式 (適用於連入或北向連線) 或後端伺服器 (適用於連出或南向連線) 收集 tcpdump 資料,因為您無法存取 Edge 路由器或訊息處理器。
    tcpdump -i any -s 0 host IP address -w File name
    
    如要進一步瞭解如何使用 tcpdump 指令,請參閱 tcpdump 資料。
  3. 使用 Wireshark 工具或類似工具分析 tcpdump 資料。
  4. 以下是使用 Wireshark 分析 tcpdump 的範例:
    • 在本例中,訊息處理器與後端伺服器之間發生 TLS/SSL 交握失敗 (外送或南向連線)。
    • 下方 tcpdump 輸出內容中的訊息 #4 顯示,訊息處理器 (來源) 已將「Client Hello」訊息傳送至後端伺服器 (目的地)。

    • 如果選取 Client Hello 訊息,系統會顯示訊息處理器使用 TLSv1.2 通訊協定,如下所示:

    • 訊息 #5 顯示後端伺服器確認訊息處理器的「Client Hello」訊息。
    • 後端伺服器會立即將「Fatal Alert : Close Notify」傳送至訊息處理器 (訊息 #6)。這表示 TLS/SSL 握手失敗,連線將會關閉。
    • 進一步查看郵件 #6,發現傳輸層安全標準 (TLS)/安全通訊端層 (SSL) 握手失敗的原因是後端伺服器僅支援 TLSv1.0 通訊協定,如下所示:

    • 由於訊息處理器和後端伺服器使用的通訊協定不一致,後端伺服器傳送了以下訊息:Fatal Alert Message: Close Notify

解析度

訊息處理器會在 Java 8 上執行,且預設使用 TLSv1.2 通訊協定。如果後端伺服器不支援 TLSv1.2 通訊協定,請採取下列其中一個步驟解決這個問題:

  1. 升級後端伺服器,支援 TLSv1.2 通訊協定。建議採用這項解決方案,因為 TLSv1.2 通訊協定更安全。
  2. 如果因為某些原因無法立即升級後端伺服器,可以按照下列步驟,強制訊息處理器使用 TLSv1.0 通訊協定與後端伺服器通訊:
    1. 如果您未在 Proxy 的 TargetEndpoint 定義中指定目標伺服器,請將 Protocol 元素設為 TLSv1.0,如下所示:
      <TargetEndpoint name="default">
       …
       <HTTPTargetConnection>
         <SSLInfo>
             <Enabled>true</Enabled>
             <Protocols>
                 <Protocol>TLSv1.0</Protocol>
             </Protocols>
         </SSLInfo>
         <URL>https://myservice.com</URL>
       </HTTPTargetConnection>
       …
      </TargetEndpoint>
    2. 如果您為 Proxy 設定 目標伺服器,請使用 管理 API,在特定目標伺服器設定中將通訊協定設為 TLSv1.0。

密碼不符

如果用戶端使用的加密套件演算法不支援 Apigee Edge 的連入 (北向) 或連出 (南向) 連線,您可能會看到 TLS/SSL 交握失敗。另請參閱「 瞭解北向和南向連線」。

診斷

  1. 判斷錯誤發生在北向南向連線。如需進一步瞭解如何判斷問題來源,請參閱「判斷問題來源」。
  2. 執行 tcpdump 公用程式,收集更多資訊:
    • 如果您是私有雲使用者,可以在相關用戶端或伺服器收集 tcpdump 資料。用戶端可以是用戶端應用程式 (適用於連入或北向連線),也可以是訊息處理器 (適用於連出或南向連線)。根據步驟 1 的判斷結果,伺服器可以是邊緣路由器 (適用於連入或北向連線),也可以是後端伺服器 (適用於連出或南向連線)。
    • 如果您是公有雲使用者,則只能在用戶端應用程式 (適用於連入或北向連線) 或後端伺服器 (適用於連出或南向連線) 收集 tcpdump 資料,因為您無法存取 Edge 路由器或訊息處理器。
    tcpdump -i any -s 0 host IP address -w File name
    
    如要進一步瞭解如何使用 tcpdump 指令,請參閱 tcpdump 資料。
  3. 使用 Wireshark 工具或您熟悉的任何其他工具,分析 tcpdump 資料。
  4. 以下是使用 Wireshark 分析 tcpdump 輸出內容的範例:
    • 在本範例中,用戶端應用程式與 Edge 路由器 (北向連線) 之間發生 TLS/SSL 交握失敗。tcpdump 輸出內容是在 Edge 路由器上收集。
    • 下方 tcpdump 輸出內容中的訊息 #4 顯示,用戶端應用程式 (來源) 將「Client Hello」訊息傳送至 Edge 路由器 (目的地)。

    • 選取「Client Hello」訊息,即可查看用戶端應用程式使用的 TLSv1.2 通訊協定。

    • 訊息 #5 顯示 Edge 路由器確認來自用戶端應用程式的「Client Hello」訊息。
    • Edge 路由器會立即將「Fatal Alert : Handshake Failure」傳送至用戶端應用程式 (訊息 #6)。這表示 TLS/SSL 握手失敗,連線將會關閉。
    • 進一步查看訊息 #6,會顯示下列資訊:
      • Edge 路由器支援 TLSv1.2 通訊協定。也就是說,用戶端應用程式和 Edge 路由器之間的通訊協定相符。
      • 不過,Edge 路由器仍會將「Fatal Alert: Handshake Failure」傳送至用戶端應用程式,如下方螢幕截圖所示:

    • 這個錯誤可能是由下列其中一項問題造成:
      • 用戶端應用程式未採用 Edge 路由器支援的加密套件演算法。
      • Edge Router 已啟用 SNI,但用戶端應用程式未傳送伺服器名稱。
    • tcpdump 輸出內容中的訊息 #4 會列出用戶端應用程式支援的加密套件演算法,如下所示:

    • Edge 路由器支援的加密套件演算法清單列於 /opt/nginx/conf.d/0-default.conf 檔案中。在本範例中,Edge 路由器僅支援高加密加密套件演算法。
    • 用戶端應用程式未使用任何高加密加密套件演算法。這個不相符問題是造成 TLS/SSL 握手失敗的原因。
    • 由於 Edge 路由器已啟用 SNI,請向下捲動至 tcpdump 輸出內容中的訊息 #4,並確認用戶端應用程式正確傳送伺服器名稱,如下圖所示:


    • 如果這個名稱有效,您可以推斷 TLS/SSL 交握失敗,是因為用戶端應用程式使用的密碼編譯套件演算法不受 Edge 路由器支援。

解析度

請務必確認用戶端使用的加密套件演算法是伺服器支援的演算法。如要解決上一個「診斷」一節所述的問題,請下載並安裝 Java Cryptography Extension (JCE) 套件,然後將其納入 Java 安裝作業,以支援高加密加密套件演算法。

憑證不正確

如果金鑰儲存區/信任儲存區中的憑證有誤,Apigee Edge 的連入 (北向) 或連出 (南向) 連線就會發生 TLS/SSL 交握失敗的情況。另請參閱「 瞭解北向和南向連線」。

如果問題是北向,您可能會看到不同的錯誤訊息,具體取決於根本原因。

下列各節列出錯誤訊息範例,以及診斷和解決這個問題的步驟。

錯誤訊息

視 TLS/SSL 交握失敗的原因而定,您可能會看到不同的錯誤訊息。 以下是呼叫 API Proxy 時可能出現的錯誤訊息範例:

* SSL certificate problem: Invalid certificate chain
* Closing connection 0
curl: (60) SSL certificate problem: Invalid certificate chain
More details here: http://curl.haxx.se/docs/sslcerts.html

可能原因

這個問題的常見原因如下:

原因 說明 誰可以執行疑難排解步驟
主機名稱不符 網址中使用的伺服器主機名稱與路由器金鑰儲存區中的憑證不符。舉例來說,如果網址中使用的主機名稱是 myorg.domain.com,但憑證的 CN 中主機名稱是 CN=something.domain.com.,就會發生不符情況。

Edge 私有和公有雲使用者
憑證鏈結不完整或錯誤 憑證鏈結不完整或不正確。 僅限 Edge 私有雲和公有雲使用者
伺服器或用戶端傳送的憑證已過期或不明 伺服器或用戶端在北向或南向連線中傳送過期或不明憑證。 Edge Private Cloud 和 Edge Public Cloud 使用者

主機名稱不符

診斷

  1. 請注意下列 Edge 管理 API 呼叫傳回的網址所用的主機名稱:
    curl -v https://myorg.domain.com/v1/getinfo
    例如:
    curl -v https://api.enterprise.apigee.com/v1/getinfo
  2. 取得儲存在特定 KeyStore 中的憑證所使用的 CN。您可以使用下列 Edge 管理 API 取得憑證詳細資料:
    1. 在金鑰儲存區中取得憑證名稱

      如果您是私有雲使用者,請使用 Management API,如下所示:
      curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs
      如果您是公有雲使用者,請按照下列步驟使用 Management API:
      curl -v https://api.enterprise.apigee.com/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs
      
    2. 使用 Edge 管理 API 取得 KeyStore 中的憑證詳細資料。

      如果您是 Private Cloud 使用者
      curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs/cert-name
      
      如果您是公有雲使用者
      curl -v https://api.enterprise.apigee.com/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs/cert-name
      

      憑證範例:

      "certInfo": [
          {
            "basicConstraints": "CA:FALSE",
            "expiryDate": 1456258950000,
            "isValid": "No",
            "issuer": "SERIALNUMBER=07969287, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O=\"GoDaddy.com, Inc.\", L=Scottsdale, ST=Arizona, C=US",
            "publicKey": "RSA Public Key, 2048 bits",
            "serialNumber": "07:bc:a7:39:03:f1:56",
            "sigAlgName": "SHA1withRSA",
            "subject": "CN=something.domain.com, OU=Domain Control Validated, O=something.domain.com",
            "validFrom": 1358287055000,
            "version": 3
          },

      主要憑證中的主體名稱含有 CN,如 something.domain.com.

      由於 API 要求網址 (請參閱上方的步驟 1) 中使用的主機名稱與憑證中的主體名稱不符,因此您會收到 TLS/SSL 交握失敗訊息。

解析度

您可以透過下列兩種方式解決這個問題:

  • 取得主體 CN 具有萬用字元憑證的憑證 (如果沒有),然後將新的完整憑證鏈上傳至 KeyStore。例如:
    "subject": "CN=*.domain.com, OU=Domain Control Validated, O=*.domain.com",
  • 取得現有主體 CN 的憑證 (如果還沒有),但請使用 your-orgyour-domain 做為主體替代名稱,然後將完整的憑證鏈上傳至金鑰儲存區。

參考資料

金鑰儲存區和信任儲存區

憑證鏈結不完整或有誤

診斷

  1. 取得儲存在特定 KeyStore 中的憑證所使用的 CN。您可以使用下列 Edge 管理 API 取得憑證詳細資料:
    1. 取得 KeyStore 中的憑證名稱

      如果您是 Private Cloud 使用者
      curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs
      
      如果您是公有雲使用者
      curl -v https://api.enterprise.apigee.com/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs
      
    2. 取得金鑰儲存庫中憑證的詳細資料:

      如果您是 Private Cloud 使用者
      curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs/cert-name
      
      如果您是公有雲使用者
      curl -v https://api.enterprise.apigee.com/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs/cert-name
      
    3. 驗證憑證及其鏈結,並確認憑證符合「 憑證鏈結的運作方式」一文中的指南,確保憑證鏈結有效且完整。如果金鑰儲存區中儲存的憑證鏈結不完整或無效,就會看到 TLS/SSL 交握失敗訊息。
    4. 下圖顯示憑證鏈結無效的憑證範例,其中中繼和根憑證不相符:
    5. 發行者和主體不相符的轉介和根憑證範例


解析度

  1. 取得包含完整有效憑證鏈結的憑證 (如果還沒有的話)。
  2. 執行下列 openssl 指令,確認憑證鏈正確無誤且完整:
    openssl verify -CAfile root-cert -untrusted intermediate-cert main-cert
  3. 將驗證過的憑證鏈結上傳至 KeyStore。

伺服器或用戶端傳送的憑證已過期或不明

如果伺服器/用戶端在北向或南向連線中傳送不正確/過期的憑證,另一端 (伺服器/用戶端) 會拒絕該憑證,導致 TLS/SSL 交握失敗。

診斷

  1. 判斷錯誤是發生在北向南向連線。如需進一步瞭解如何判斷問題來源,請參閱「 判斷問題來源」。
  2. 執行 tcpdump 公用程式,收集更多資訊:
    • 如果您是私有雲使用者,可以在相關用戶端或伺服器收集 tcpdump 資料。用戶端可以是用戶端應用程式 (適用於連入或北向連線),也可以是訊息處理器 (適用於連出或南向連線)。根據步驟 1 的判斷結果,伺服器可以是邊緣路由器 (適用於連入或北向連線),也可以是後端伺服器 (適用於連出或南向連線)。
    • 如果您是公有雲使用者,則只能在用戶端應用程式 (適用於連入或北向連線) 或後端伺服器 (適用於連出或南向連線) 收集 tcpdump 資料,因為您無法存取 Edge 路由器或訊息處理器。
    tcpdump -i any -s 0 host IP address -w File name
    
    如要進一步瞭解如何使用 tcpdump 指令,請參閱 tcpdump 資料。
  3. 使用 Wireshark 或類似工具分析 tcpdump 資料。
  4. tcpdump 輸出內容判斷在驗證步驟中拒絕憑證的主機 (用戶端或伺服器)。
  5. 如果資料未加密,您可以從 tcpdump 輸出內容中擷取另一端傳送的憑證。這項資訊有助於比較這個憑證與信任儲存區中的憑證是否相符。
  6. 請參閱tcpdump範例,瞭解訊息處理器與後端伺服器之間的 SSL 通訊。

    範例 tcpdump 顯示「憑證不明」錯誤


    1. 訊息處理器 (用戶端) 會在訊息 #59 中,將「Client Hello」傳送至後端伺服器 (伺服器)。
    2. 後端伺服器會在訊息 #61 中,將「Server Hello」傳送至訊息處理器。
    3. 雙方會相互驗證所用的通訊協定和加密套件演算法。
    4. 後端伺服器會將憑證和「Server Hello Done」訊息傳送至訊息處理器 (訊息 #68)。
    5. 訊息處理器會在訊息 #70 中傳送嚴重警示「Description: Certificate Unknown」(說明:憑證不明)
    6. 進一步查看訊息 #70,除了下方顯示的快訊訊息外,沒有其他詳細資料:


    7. 查看訊息 #68,瞭解後端伺服器傳送的憑證詳細資料,如下圖所示:

    8. 如上圖所示,後端伺服器的憑證和完整鏈結都位於「憑證」部分下方。
  7. 如果路由器 (北向) 或訊息處理器 (南向) 發現憑證不明,如上例所示,請按照下列步驟操作:
    1. 取得儲存在特定信任儲存區的憑證及其鏈結。(請參閱路由器虛擬主機設定和訊息處理器目標端點設定)。您可以使用下列 API 取得憑證詳細資料:
      1. 在信任儲存區中取得憑證名稱:
        curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/truststore-name/certs
      2. 取得信任儲存區中憑證的詳細資料:
        curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/truststore-name/certs/cert-name
    2. 檢查儲存在路由器 (北向) 或訊息處理器 (南向) 信任儲存區中的憑證,是否與儲存在用戶端應用程式 (北向) 或目標伺服器 (南向) 金鑰儲存區中的憑證相符,或是與從 tcpdump 輸出內容取得的憑證相符。如果不一致,就是造成 TLS/SSL 握手失敗的原因。
  8. 如果用戶端應用程式 (北向) 或目標伺服器 (南向) 發現憑證不明,請按照下列步驟操作:
    1. 取得特定 KeyStore 中儲存的憑證所用完整憑證鏈結。(請參閱 Router 的虛擬主機設定,以及訊息處理器的目標端點設定)。您可以使用下列 API 取得憑證詳細資料:
      1. 在金鑰儲存庫中取得憑證名稱:
        curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs
      2. 取得 KeyStore 中憑證的詳細資料:
        curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs/cert-name
        
    2. 檢查儲存在路由器 (北向) 或訊息處理器 (南向) 金鑰儲存區中的憑證,是否與儲存在用戶端應用程式 (北向) 或目標伺服器 (南向) 信任儲存區中的憑證相符,或是與從 tcpdump 輸出內容取得的憑證相符。如果不一致,這就是導致 SSL 握手失敗的原因。
  9. 如果系統發現伺服器/用戶端傳送的憑證已過期,接收憑證的用戶端/伺服器就會拒絕該憑證,且您會在 tcpdump 中看到下列警示訊息:

    快訊 (層級:嚴重;說明:憑證已過期)

  10. 確認適當主機金鑰儲存區中的憑證是否已過期。

解析度

如要解決上述範例中的問題,請將有效的後端伺服器憑證上傳至訊息處理器的信任儲存區。

下表彙整了根據問題原因解決問題的步驟。

原因 說明 解決方法
憑證已過期 NorthBound
  • 儲存在路由器金鑰儲存區的憑證已過期。
  • 儲存在用戶端應用程式金鑰儲存區的憑證已過期 (雙向 SSL)。
將新憑證及其完整鏈結上傳至適當主機上的 KeyStore。
SouthBound
  • 儲存在目標伺服器金鑰儲存區的憑證已過期。
  • 儲存在訊息處理器金鑰儲存區的憑證已過期 (雙向 SSL)。
將新憑證及其完整鏈結上傳至適當主機上的 KeyStore。
不明憑證 NorthBound
  • 用戶端應用程式信任存放區中儲存的憑證與 Router 的憑證不符。
  • 路由器信任儲存區中儲存的憑證與用戶端應用程式的憑證不符 (雙向 SSL)。
將有效憑證上傳至適當主機上的信任儲存區。
SouthBound
  • 儲存在目標伺服器信任儲存庫的憑證與 Message Processor 的憑證不符。
  • 儲存在 Message Processor 信任儲存區的憑證與目標伺服器的憑證不符 (雙向 SSL)。
將有效憑證上傳至適當主機上的信任儲存區。

已啟用 SNI 伺服器

如果用戶端與啟用伺服器名稱指示 (SNI) 的伺服器通訊,但用戶端未啟用 SNI,就可能發生 TLS/SSL 握手失敗的情況。這可能發生在 Edge 的北向或南向連線。

首先,您需要找出所用伺服器的主機名稱和通訊埠號碼,並檢查是否已啟用 SNI。

識別已啟用 SNI 的伺服器

  1. 執行 openssl 指令,然後不要傳遞伺服器名稱,嘗試連線至相關伺服器主機名稱 (Edge 路由器或後端伺服器),如下所示:
    openssl s_client -connect hostname:port
    您可能會取得憑證,有時可能會在 openssl 指令中觀察到交握失敗,如下所示:
    CONNECTED(00000003)
    9362:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-64.50.6/src/ssl/s23_clnt.c:593
  2. 執行 openssl 指令,並嘗試傳遞伺服器名稱,連線至相關伺服器主機名稱 (邊緣路由器或後端伺服器),如下所示:
    openssl s_client -connect hostname:port -servername hostname
  3. 如果在步驟 1 中握手失敗,或步驟 1 和步驟 2 取得的憑證不同,表示指定的伺服器已啟用 SNI。

確認伺服器已啟用 SNI 後,請按照下列步驟操作,檢查 TLS/SSL 交握失敗是否是因為用戶端無法與 SNI 伺服器通訊所致。

診斷

  1. 判斷錯誤是發生在北向南向連線。如需進一步瞭解如何判斷問題來源,請參閱「 判斷問題來源」。
  2. 執行 tcpdump 公用程式,收集更多資訊:
    • 如果您是私有雲使用者,可以在相關用戶端或伺服器收集 tcpdump 資料。用戶端可以是用戶端應用程式 (適用於連入或北向連線),也可以是訊息處理器 (適用於連出或南向連線)。根據步驟 1 的判斷結果,伺服器可以是邊緣路由器 (適用於連入或北向連線),也可以是後端伺服器 (適用於連出或南向連線)。
    • 如果您是公有雲使用者,則只能在用戶端應用程式 (適用於連入或北向連線) 或後端伺服器 (適用於連出或南向連線) 收集 tcpdump 資料,因為您無法存取 Edge 路由器或訊息處理器。
    tcpdump -i any -s 0 host IP address -w File name
    
    如要進一步瞭解如何使用 tcpdump 指令,請參閱 tcpdump 資料。
  3. 使用 Wireshark 或類似工具分析 tcpdump 輸出內容。
  4. 以下是使用 Wireshark 分析 tcpdump 的範例:
    1. 在本例中,Edge 訊息處理器與後端伺服器 (南向連線) 之間發生 TLS/SSL 交握失敗。
    2. 下方 tcpdump 輸出內容中的訊息 #4 顯示,訊息處理器 (來源) 已將「Client Hello」訊息傳送至後端伺服器 (目的地)。

    3. 選取「Client Hello」訊息,即可查看訊息處理器使用的 TLSv1.2 通訊協定。

    4. 訊息 #4 顯示後端伺服器確認來自訊息處理器的「Client Hello」訊息。
    5. 後端伺服器會立即傳送「Fatal Alert : Handshake Failure」給訊息處理器 (訊息 #5)。這表示 TLS/SSL 交握失敗,連線將會關閉。
    6. 查看訊息 #6,瞭解下列資訊:
      • 後端伺服器支援 TLSv1.2 通訊協定。這表示訊息處理器和後端伺服器之間的通訊協定相符。
      • 不過,後端伺服器仍會將「Fatal Alert: Handshake Failure」傳送至訊息處理器,如下圖所示:

    7. 發生這項錯誤的原因如下:
      • 訊息處理器未採用後端伺服器支援的加密套件演算法。
      • 後端伺服器已啟用 SNI,但用戶端應用程式未傳送伺服器名稱。
    8. 請詳閱 tcpdump 輸出內容中的訊息 #3 (Client Hello)。請注意,如下所示,缺少「Extension: server_name」

    9. 這可確認訊息處理器未將 server_name 傳送至啟用 SNI 的後端伺服器。
    10. 這就是 TLS/SSL 握手失敗的原因,也是後端伺服器將「Fatal Alert: Handshake Failure」傳送至 Message Processor 的原因。
  5. 確認訊息處理器上的 jsse.enableSNIExtension property system.properties 已設為 false,確認訊息處理器未啟用與啟用 SNI 的伺服器通訊。

解析度

請按照下列步驟操作,讓訊息處理器與啟用 SNI 的伺服器通訊:

  1. 建立 /opt/apigee/customer/application/message-processor.properties 檔案 (如果還沒有的話)。
  2. 在這個檔案中新增下列程式碼: conf_system_jsse.enableSNIExtension=true
  3. 將這個檔案的擁有者 Chown 為 apigee:apigee
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
  4. 重新啟動訊息處理器。
    /opt/apigee/apigee-service/bin/apigee-service message-processor restart
  5. 如果有多個訊息處理器,請在所有訊息處理器上重複步驟 1 到 4。

如果無法判斷 TLS/SSL 交握失敗的原因並修正問題,或需要進一步協助,請與 Apigee Edge 支援團隊聯絡。請提供問題的完整詳細資料,以及 tcpdump 輸出內容。