您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
問題
用戶端應用程式會收到 HTTP 400 - Bad request 回應,並顯示「The SSL certificate error」訊息。如果為連入 Apigee Edge 的連線啟用雙向 TLS 設定,Edge 路由器通常會傳送這項錯誤。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 400 Bad Request
接著是下列 HTML 錯誤頁面:
<html>
<head>
<title>400 The SSL certificate error</title>
</head>
<body bgcolor="white">
<center> <h1>400 Bad Request</h1>
</center>
<center>The SSL certificate error</center>
<hr>
<center>nginx</center>
</body>
</html>可能原因
這個問題的可能原因如下:
| 原因 | 說明 | 適用於以下裝置的疑難排解說明 |
| 用戶端憑證過期 | 用戶端傳送的憑證已過期。 | Edge 私有雲和公有雲使用者 |
| 用戶端傳送的憑證不正確 | 如果用戶端應用程式傳送的憑證與 Edge 路由器信任儲存庫中儲存的憑證不符,就會擲回這項錯誤。 | Edge 私有雲和公有雲使用者 |
| 信任儲存區缺少用戶端根憑證 | 如果 Edge 路由器信任儲存區中缺少用戶端 CA 簽署的根憑證,就會擲回這項錯誤。 | Edge 私有雲和公有雲使用者 |
| 用戶端憑證未載入 Edge 路由器 | 如果上傳至信任儲存區的用戶端憑證未載入路由器,就會擲回這個錯誤。 | Edge Private Cloud 使用者 |
原因:用戶端憑證已過期
如果用戶端傳送的憑證已過期,通常會發生雙向 TLS 問題。在雙向 TLS 中,用戶端和伺服器會交換公開憑證,完成握手程序。用戶端會驗證伺服器憑證,伺服器則會驗證用戶端憑證。
在 Edge 中,雙向 TLS 是在虛擬主機實作,伺服器憑證會新增至金鑰儲存區,用戶端憑證則會新增至信任存放區。
如果在 TLS 交握期間發現用戶端憑證已過期,伺服器會傳送 400 - Bad request,並顯示「The SSL certificate error」訊息。
診斷
登入 Edge UI,查看發出 API 要求的特定虛擬主機設定 (依序點選「管理」>「虛擬主機」),或使用 Get virtual host API 管理 API 取得特定虛擬主機的定義。
雙向 TLS 通訊的虛擬主機通常如下所示:
<VirtualHost name="myTLSVHost"> <HostAliases> <HostAlias>api.myCompany.com</HostAlias> </HostAliases> <Port>443</Port> <SSLInfo> <Enabled>true</Enabled> <ClientAuthEnabled>true</ClientAuthEnabled> <KeyStore>ref://myKeystoreRef</KeyStore> <KeyAlias>myKeyAlias</KeyAlias> <TrustStore>ref://myTruststoreRef</TrustStore> </SSLInfo> </VirtualHost>判斷虛擬主機中使用的信任儲存區參照。在上述範例中,信任儲存庫參照名稱為 myTruststoreRef。
- 判斷 Truststore 參考資料所指向的 Truststore。
- 在 Edge UI 中,依序前往「Admin」>「Environments」>「References」 ,然後搜尋 Truststore 參照名稱。
請記下特定信任儲存區參照的「Reference」欄中的名稱。 這會是 Truststore 名稱。
圖 1 在上述範例中,請注意 myTruststoreRef 參照 myTruststore。因此,信任儲存庫名稱為 myTruststore。
- 在 Edge UI 的「管理」>「環境」>「傳輸層安全標準 (TLS) 金鑰儲存區」中,前往「傳輸層安全標準 (TLS) 金鑰儲存區」,然後尋找步驟 3 中找到的信任儲存區。
在特定信任儲存區 (如上述步驟 3 所判斷) 下方選取憑證,如下所示:
圖 2 上述範例中別名為
client-cert-markw的憑證已過期。- 檢查信任儲存區的憑證別名是否已過期。
- 如果憑證未過期,請參閱其他原因的常見診斷步驟。
解析度
取得新憑證並上傳:
- 建立新的信任儲存區,例如 myNewTruststore。
- 將新憑證上傳至新建立的信任儲存區。
按照「修改參照」一文中的步驟,修改特定虛擬主機中使用的信任儲存庫參照,指向新的信任儲存庫。
在上述範例中,請將參照 myTruststoreRef 指向 myNewTruststore。
其他原因的常見診斷步驟
- 如要調查這個問題,請使用 tcpdump 工具擷取 TCP/IP 封包。
- 如果您是 Private Cloud 使用者,則可以在用戶端應用程式或路由器上擷取 TCP/IP 封包。
- 如果您是公有雲使用者,請擷取用戶端應用程式上的 TCP/IP 封包。
決定要擷取 TCP/IP 封包的位置後,請使用下列 tcpdump 指令擷取 TCP/IP 封包:
tcpdump -i any -s 0 host <IP address> -w <File name>
注意:如果您是在路由器上擷取 TCP/IP 封包,請在
tcpdump指令中使用用戶端應用程式的公開 IP 位址。如果您要在用戶端應用程式上擷取 TCP/IP 封包,請在
tcpdump指令中使用虛擬主機中使用的主機名稱公開 IP 位址。如要進一步瞭解這項工具和這個指令的其他變體,請參閱 tcpdump。
- 使用 Wireshark 工具或您熟悉的類似工具,分析收集到的 TCP/IP 封包。
以下是使用 Wireshark 工具分析的 TCP/IP 封包資料範例:
- tcpdump 中的封包 #30 (下圖) 顯示,用戶端應用程式 (來源) 已將「Client Hello」訊息傳送至路由器 (目的地)。
- 封包 #34 顯示路由器確認來自用戶端應用程式的 Client Hello 訊息。
- 路由器會在封包 #35 中傳送「Server Hello」,然後傳送自己的憑證,並在封包 #38 中要求用戶端應用程式傳送憑證。
- 在封包 #38 中,路由器會傳送「憑證要求」封包,請檢查「識別名稱」部分,其中提供用戶端憑證、憑證鏈結,以及路由器 (伺服器) 接受的憑證授權單位詳細資料。
用戶端應用程式會在封包 # 41 中傳送憑證。檢查封包 # 41 中的「Certificate Verify」(憑證驗證) 部分,判斷用戶端應用程式傳送的憑證。
圖 4 - 確認用戶端應用程式傳送的憑證和憑證鏈結主體與簽發者 (封包 #41),是否與路由器接受的憑證和憑證鏈結 (封包 #38) 相符。如果不一致,就是造成這項錯誤的原因。因此,路由器 (伺服器) 會將加密警示 (封包 #57) 和 FIN、ACK (封包 58) 傳送至用戶端應用程式,最終終止連線。
- 憑證及其鏈結不符的原因可能如下節所述。
原因:用戶端傳送的憑證有誤
如果用戶端應用程式傳送的憑證和/或憑證鏈結主體/簽發者,與路由器 (伺服器) 信任存放區中儲存的憑證和/或憑證鏈結不符,通常就會發生這種情況。
診斷
登入 Edge 使用者介面,查看要發出 API 要求的特定虛擬主機設定 (依序點選「管理」>「虛擬主機」),或使用 Get virtual host API 管理 API 取得特定虛擬主機的定義。
雙向 TLS 通訊的虛擬主機通常如下所示:
<VirtualHost name="myTLSVHost"> <HostAliases> <HostAlias>api.myCompany.com</HostAlias> </HostAliases> <Port>443</Port> <SSLInfo> <Enabled>true</Enabled> <ClientAuthEnabled>true</ClientAuthEnabled> <KeyStore>ref://myKeystoreRef</KeyStore> <KeyAlias>myKeyAlias</KeyAlias> <TrustStore>ref://myCompanyTruststoreRef</TrustStore> </SSLInfo> </VirtualHost>- 判斷虛擬主機中使用的信任儲存區參照。
在上述範例中,信任儲存庫參照名稱為 myCompanyTruststoreRef。
- 判斷 Truststore 參考資料所指向的 Truststore。
- 在 Edge UI 中,依序前往「管理」>「環境參照」 ,然後搜尋信任儲存區參照名稱。
請記下特定信任儲存區參照的「參照」欄中的名稱。 這會是 Truststore 名稱。
圖 5 在上述範例中,請注意 myCompanyTruststoreRef 參照了 myCompanyTruststore。因此,信任儲區名稱為 myCompanyTruststore。
- 使用下列 API 取得儲存在信任儲存庫中的憑證 (在上一個步驟中決定):
-
這個 API 會列出特定信任儲存區中的所有憑證。
從 KeyStore 或 TrustStore API 取得憑證詳細資料。
這個 API 會傳回特定信任儲存區中特定憑證的相關資訊。
-
- 檢查 myCompanyTruststore 中儲存的每個憑證及其鏈結的簽發者和主體,是否與上述 TCP/IP 封包 (請參閱封包 #38) 中的憑證及其鏈結相符。如果兩者不符,表示上傳至信任儲存庫的憑證未載入 Edge 路由器。請前往「原因:用戶端憑證未載入 Edge 路由器」。
- 如果在步驟 5 中未發現不符情況,表示用戶端應用程式未傳送正確的憑證及其鏈結。
解析度
確認用戶端應用程式傳送至 Edge 的憑證和憑證鏈正確無誤。
原因:信任儲存庫中缺少用戶端根憑證
如果 Edge 路由器信任儲存區中缺少用戶端 CA 簽署的根憑證,就會擲回這項錯誤。
診斷
登入 Edge 使用者介面,查看 API 要求的特定虛擬主機設定 (依序點選「管理」>「虛擬主機」> virtual_host),或使用 Get virtual host API 取得特定虛擬主機的定義。
雙向 TLS 通訊的虛擬主機通常如下所示:
<VirtualHost name="myTLSVHost"> <HostAliases> <HostAlias>api.myCompany.com</HostAlias> </HostAliases> <Port>443</Port> <SSLInfo> <Enabled>true</Enabled> <ClientAuthEnabled>true</ClientAuthEnabled> <KeyStore>ref://myKeystoreRef</KeyStore> <KeyAlias>myKeyAlias</KeyAlias> <TrustStore>ref://myCompanyTruststoreRef</TrustStore> </SSLInfo> </VirtualHost>- 判斷虛擬主機中使用的信任儲存庫參照。在上述範例中,信任儲存庫參照名稱為 myCompanyTruststoreRef。
- 判斷信任儲存庫參照使用的實際信任儲存庫。
- 在 Edge UI 中,依序前往「管理」>「環境」>「參照」,然後搜尋信任儲存區參照名稱。
特定信任儲存庫參照的信任儲存庫名稱位於「參照」欄。
圖 6 在本範例中,請注意「Reference」欄中的 myCompanyTruststoreRef 具有 myCompanyTruststore。因此,信任儲存庫名稱為「myCompanyTruststore」myCompanyTruststore。
- 使用下列 API 取得儲存在信任儲存區 (在上一個步驟中決定) 的憑證:
- 列出 KeyStore 或信任儲存庫 API 的憑證。這個 API 會列出信任儲存區中的所有憑證。
- 從 KeyStore 或 TrustStore API 取得憑證詳細資料。這個 API 會傳回信任儲存區中特定憑證的相關資訊。
檢查憑證是否包含完整鏈結,包括特定用戶端傳送的根憑證 (如 TCP/IP 封包所示,請參閱圖 4)。信任儲存庫必須包含根憑證,以及用戶端的分葉憑證或分葉和中繼憑證。如果信任儲存區缺少用戶端的有效根憑證,就會導致錯誤。
不過,如果信任儲存區中存在用戶端的完整憑證鏈結 (包括根憑證),則表示上傳至信任儲存區的憑證可能未載入 Edge 路由器。如果是這種情況,請參閱「原因:用戶端憑證未載入 Edge 路由器」。
解析度
請確認 Apigee Edge 路由器的信任儲存庫中,有正確的用戶端憑證 (包括根憑證)。
原因:用戶端憑證未載入 Edge 路由器
- 如果您是公有雲使用者,請與 Apigee Edge 支援團隊聯絡。
- 如果您是 Private Cloud 使用者,請按照下列說明操作每個路由器:
解析度
重新啟動路由器,確保載入最新憑證。步驟如下:
apigee-service edge-router restart
重新執行 API 並檢查結果。如果問題仍未解決,請參閱「收集診斷資訊」。
收集診斷資訊
如果按照上述指示操作後問題仍未解決,請收集下列診斷資訊。 請聯絡 Apigee Edge 支援團隊,並提供您收集到的資訊:
- 如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 虛擬主機名稱
- 主機別名
- 完成 curl 指令,重現錯誤
- 在用戶端應用程式上擷取的 TCP/IP 封包
- 如果您是 Private Cloud 使用者,請提供下列資訊:
- 虛擬主機名稱及其定義 (使用 Get virtual host API)
- 主機別名
- 出現的完整錯誤訊息
- 在用戶端應用程式或路由器上擷取的 TCP/IP 封包。
- 列出 KeyStore API 中的憑證 API 的輸出內容,以及使用「取得憑證詳細資料 API」取得的每個憑證詳細資料。
- 您已嘗試使用本 Playbook 中的哪些章節,以及任何其他有助於我們加快解決這個問題的洞察資訊。