查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
問題
用戶端應用程式收到包含 HTTP 400 - Bad request 的回應 「SSL 憑證錯誤」訊息。這個錯誤通常是由 Edge Router 所傳送 。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
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>
可能原因
這個問題的可能原因如下:
原因 | 說明 | 疑難排解操作說明 |
用戶端憑證過期 | 用戶端傳送的憑證已過期。 | 邊緣私人與公有雲使用者 |
用戶端傳送的憑證有誤 | 如果用戶端應用程式傳送的憑證不符,就會發生這個錯誤 含有儲存在邊緣路由器信任存放區的憑證 | 邊緣私人與公有雲使用者 |
Truststore 中缺少用戶端根憑證 | 如果 Edge 路由器的信任儲存庫 | 邊緣私人與公有雲使用者 |
未在 Edge Router 中載入用戶端憑證 | 如果未載入上傳至信任儲存庫的用戶端憑證,系統就會擲回這個錯誤 連線到路由器 | Edge Private Cloud 使用者 |
原因:用戶端憑證過期
這個問題通常來自 2-WTLS, 用戶端傳送的憑證過期時。採用雙向傳輸層安全標準 (TLS) 時,用戶端與伺服器交換作業皆適用 公開憑證來完成握手。用戶端會驗證伺服器憑證 伺服器也會驗證用戶端憑證
在 Edge 中,雙向傳輸層安全標準 (TLS) 則是在虛擬主機上實作, ,將伺服器憑證新增至 KeyStore,並將用戶端憑證新增至信任儲存庫。
在 TLS 握手期間,如果發現用戶端憑證已過期,則伺服器: 會傳送 400 - Bad request 及「The SSL certificate error」訊息。
診斷
登入 Edge UI 並查看特定的虛擬主機設定 ([Admin] > [Virtual Hosts])。 建立虛擬主機 API,或使用 Get virtual host API management 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>
決定虛擬主機中使用的 Truststore 參照。在上述範例中 Truststore 參考名稱為 myTruststoreRef。
- 決定 Truststore 參照所指向的 Truststore。
- 在 Edge UI 中,依序前往「Admin」>環境 >參考資料 並搜尋 Truststore 參考名稱。
記下特定 Truststore 參照的「Reference」欄中的名稱。 這會成為您的 Truststore 名稱。
在上述範例中,請注意 myTruststoreRef 包含的 至 myTruststore。因此,Truststore 名稱為 myTruststore。
- 在「管理」>「」環境 >在 Edge UI 中採用 TLS KeyStore,然後前往傳輸層安全標準 (TLS) 並在步驟 3 中找到 Truststore。
選取特定 Truststore (如上方步驟 3 所述) 下的憑證,如下所示:
在上述範例中,別名
client-cert-markw
的憑證顯示 已過期。- 檢查信任存放區的憑證別名是否已過期。
- 如果憑證並未過期,請參閱其他原因的常見診斷步驟。
解析度
取得新憑證並上傳憑證:
- 建立新的信任存放區,例如 myNewTruststore.
- 將新憑證上傳至新建立的信任存放區。
修改特定虛擬主機中使用的信任參照,使其指向新的 建立信任存放區 修改參照。
在上述範例中,將參照 myTruststoreRef 指向 myNewTruststore。
其他原因的常見診斷步驟
- 如要調查這個問題,您必須使用以下項目擷取 TCP/IP 封包:
tcpdump 工具。
- 如果您是 Private Cloud 使用者,可以在 用戶端應用程式或路由器
- 如果您是公用雲端使用者,請在用戶端應用程式擷取 TCP/IP 封包。
確定要擷取 TCP/IP 封包的位置後,請使用下列 tcpdump 指令擷取 TCP/IP 封包:
tcpdump -i any -s 0 host <IP address> -w <File name>
注意:如果您要在路由器上擷取 TCP/IP 封包,請使用 用戶端應用程式的
tcpdump
指令公開 IP 位址。如果您從用戶端應用程式擷取 TCP/IP 封包,請使用公開 IP 在
tcpdump
指令中,虛擬主機使用的主機名稱位址。請參閱 tcpdump 進一步瞭解這項工具和其他指令變化版本。
- 分析使用 您熟悉的 Wireshark 工具或類似工具。
以下分析使用 Wireshark 工具的 TCP/IP 封包資料樣本:
- tcpdump 中的封包 #30 顯示「用戶端應用程式」(來源) 已傳送「Client Hello」訊息傳送至路由器 (目的地)。
- 封包 #34 顯示路由器確認從用戶端應用程式確認的 Client Hello 訊息。
- 路由器會傳送「Server Hello」並在封包 #35 中傳送憑證 要求用戶端應用程式在封包 #38 中傳送憑證。
- 在路由器 #38 中 (路由器傳送「憑證要求」封包的位置) 中檢查 「辨別名稱」這個區段提供關於用戶端憑證及其鏈結的詳細資訊 以及路由器接受的憑證授權單位 (伺服器)。
用戶端應用程式會在封包 # 41 中傳送憑證。檢查憑證 在封包 # 41 中驗證部分,找出用戶端應用程式傳送的憑證。
- 確認用戶端是否傳送憑證的主體和核發者及其鏈結 應用程式 (封包 #41) 與路由器的接受憑證及其鏈結相符 (封包 #38)。如果不相符,就會是導致這類錯誤的原因。使得路由器 (伺服器) 將加密警示 (封包 #57) 和 FIN、ACK (封包 58) 傳送至 用戶端應用程式,最後也會終止連線。
- 憑證與鏈結不相符的原因可能是 以下各節。
原因:用戶端傳送的憑證有誤
這通常是因為 用戶端應用程式與路由器 (伺服器) 信任存放區中儲存的憑證和/或其鏈結不相符。
診斷
登入 Edge UI 並查看特定的虛擬主機設定 ([Admin] > [Virtual Hosts])。 或使用 Get virtual host API management 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>
- 決定虛擬主機中使用的 Truststore 參照。
在上述範例中,Truststore 參考名稱為 myCompanyTruststoreRef。
- 決定 Truststore 參照所指出的 Truststore。
- 在 Edge UI 中,依序前往「Admin」>環境參考資料 並搜尋 Truststore 參考名稱。
記下特定 Truststore 參照的「Reference」欄中的名稱。 這會成為您的 Truststore 名稱。
在上述範例中,請注意 myCompanyTruststoreRef 的 參照 myCompanyTruststore。因此 Truststore 名稱為 myCompanyTruststore。
- 使用下列 API 取得儲存在 Truststore 中的憑證 (如上一個步驟中決定):
列出 KeyStore 或 Truststore API 的憑證。
這個 API 會列出特定 Truststore 中的所有憑證。
從 KeyStore 或 Truststore API 取得憑證詳細資料。
這個 API 會傳回特定 Truststore 中特定憑證的相關資訊。
- 檢查各憑證的核發者和主體,以及各個憑證儲存在哪個鏈結中的主體 myCompanyTruststore 與憑證及其鏈結中的憑證相符 中所述的通訊埠數量 (參照封包 #38)。如果有不相符 上傳至信任存放區的憑證並未在 Edge Router 中載入。 移至「原因:未在 Edge Router 中載入用戶端憑證」。
- 如果步驟 5 中沒有不相符的項目,表示用戶端應用程式 未傳送正確的憑證及其鏈結。
解析度
確認用戶端應用程式已將正確的憑證及其鏈結傳送至 Edge。
原因:Truststore 中缺少用戶端根憑證
如果 Edge 路由器的信任儲存庫
診斷
登入 Edge UI 並查看 API 的特定虛擬主機設定 ([Admin] > [Virtual Hosts] > [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 中,依序前往「Admin」>環境 >參考資料和搜尋 。
特定信任儲存庫參照的信任儲存庫名稱位於 參考資料欄。
在這個範例中,請注意 myCompanyTruststoreRef 已 「參考資料」欄中的 myCompanyTruststore。因此 Truststore 名稱為 myCompanyTruststore。
- 使用
並支援下列 API:
- 列出 KeyStore 或 Truststore API 的憑證。這個 API 會列出 憑證
- 從 KeyStore 或 Truststore API 取得憑證詳細資料。這個 API 會傳回 特定憑證
檢查憑證是否包含完整鏈結 (包括根憑證) 來自特定用戶端,如 TCP/IP 封包中所顯示的內容 (請見圖 4)。信任儲存庫 必須包含根憑證,以及用戶端的分葉憑證或分葉,且 中繼憑證如果信任儲存庫中缺少用戶端的有效根憑證, 或是導致錯誤的原因
不過,如果用戶端的完整憑證鏈結 (包括根憑證) 存在,表示該憑證已上傳到 信任儲存庫可能無法在 Edge Router 中載入。在此情況下,請參閱 原因:未在 Edge Router 中載入用戶端憑證。
解析度
確認可用的用戶端憑證 (包括根憑證) 可用 位於 Apigee Edge 路由器的信任存放區中
原因:未在 Edge Router 中載入用戶端憑證
- 如果您是公用雲端使用者,請與 Apigee Edge 支援團隊聯絡。
- 如果您是 Private Cloud 使用者,請在每個路由器上按照下列指示操作:
- 檢查「
/opt/nginx/conf.d/OrgName_envName_vhostName-client.pem
」檔案是否存在 套用至特定虛擬主機的 Cookie如果檔案不存在,請移至 解決方法」一節。 - 如果檔案存在,請使用下列
openssl
指令取得 邊緣路由器可用的憑證:openssl -in <OrgName_envName_vhostName-client.pem> -text -noout
- 查看憑證的核發機構、主旨和到期日。如果有任何一組不符合 與 Edge UI 中的 Truststore 搭配使用,或是使用管理 API 錯誤原因
- 可能是路由器未重新載入上傳的憑證。
- 檢查「
解析度
請按照下列步驟重新啟動路由器,確保系統已載入最新憑證:
apigee-service edge-router restart
請重新執行 API 並檢查結果。如果問題仍未解決,請前往 收集診斷資訊。
收集診斷資訊
按照上述說明操作後,如果問題仍未解決,請收集下列診斷資訊。 與 Apigee Edge 支援聯絡並分享您收集的資訊:
- 如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 虛擬主機名稱
- 主機別名名稱
- 完成 curl 指令即可重現錯誤
- 用戶端應用程式擷取的 TCP/IP 封包數
- 如果您是 Private Cloud 使用者,請提供以下資訊:
- 使用 Get virtual host API 定義虛擬主機名稱及其定義
- 主機別名名稱
- 觀察到完整的錯誤訊息
- 用戶端應用程式或路由器擷取的 TCP/IP 封包。
- 列出 KeyStore API 中的憑證的輸出內容 API 和 Get cert details API 取得的所有憑證詳細資料。
- 詳細說明您試過哪些應對手冊的章節,以及有哪些其他分析資訊 能快速解決這個問題