400 無效要求 - SSL 憑證錯誤

查看 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」訊息。

診斷

  1. 登入 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>
    
  2. 決定虛擬主機中使用的 Truststore 參照。在上述範例中 Truststore 參考名稱為 myTruststoreRef

  3. 決定 Truststore 參照所指向的 Truststore。
    1. 在 Edge UI 中,依序前往「Admin」>環境 >參考資料 並搜尋 Truststore 參考名稱。
    2. 記下特定 Truststore 參照的「Reference」欄中的名稱。 這會成為您的 Truststore 名稱。

      Edge UI 顯示
                                                             參考資料
      圖 1

      在上述範例中,請注意 myTruststoreRef 包含的 至 myTruststore。因此,Truststore 名稱為 myTruststore

  4. 在「管理」>「」環境 >在 Edge UI 中採用 TLS KeyStore,然後前往傳輸層安全標準 (TLS) 並在步驟 3 中找到 Truststore。
  5. 選取特定 Truststore (如上方步驟 3 所述) 下的憑證,如下所示:

    圖 2

    在上述範例中,別名 client-cert-markw 的憑證顯示 已過期。

  6. 檢查信任存放區的憑證別名是否已過期。
  7. 如果憑證並未過期,請參閱其他原因的常見診斷步驟

解析度

取得新憑證並上傳憑證:

  1. 建立新的信任存放區,例如 myNewTruststore.
  2. 將新憑證上傳至新建立的信任存放區。
  3. 修改特定虛擬主機中使用的信任參照,使其指向新的 建立信任存放區 修改參照

    在上述範例中,將參照 myTruststoreRef 指向 myNewTruststore

其他原因的常見診斷步驟

  1. 如要調查這個問題,您必須使用以下項目擷取 TCP/IP 封包: tcpdump 工具。
    1. 如果您是 Private Cloud 使用者,可以在 用戶端應用程式或路由器
    2. 如果您是公用雲端使用者,請在用戶端應用程式擷取 TCP/IP 封包。
    3. 確定要擷取 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 進一步瞭解這項工具和其他指令變化版本。

  2. 分析使用 您熟悉的 Wireshark 工具或類似工具。

以下分析使用 Wireshark 工具的 TCP/IP 封包資料樣本:

  1. tcpdump 中的封包 #30 顯示「用戶端應用程式」(來源) 已傳送「Client Hello」訊息傳送至路由器 (目的地)。
  2. 封包 #34 顯示路由器確認從用戶端應用程式確認的 Client Hello 訊息。
  3. 路由器會傳送「Server Hello」並在封包 #35 中傳送憑證 要求用戶端應用程式在封包 #38 中傳送憑證。
  4. 在路由器 #38 中 (路由器傳送「憑證要求」封包的位置) 中檢查 「辨別名稱」這個區段提供關於用戶端憑證及其鏈結的詳細資訊 以及路由器接受的憑證授權單位 (伺服器)。
  5. 圖 3
  6. 用戶端應用程式會在封包 # 41 中傳送憑證。檢查憑證 在封包 # 41 中驗證部分,找出用戶端應用程式傳送的憑證。

    圖 4
  7. 確認用戶端是否傳送憑證的主體和核發者及其鏈結 應用程式 (封包 #41) 與路由器的接受憑證及其鏈結相符 (封包 #38)。如果不相符,就會是導致這類錯誤的原因。使得路由器 (伺服器) 將加密警示 (封包 #57) 和 FIN、ACK (封包 58) 傳送至 用戶端應用程式,最後也會終止連線。
  8. 憑證與鏈結不相符的原因可能是 以下各節。

原因:用戶端傳送的憑證有誤

這通常是因為 用戶端應用程式與路由器 (伺服器) 信任存放區中儲存的憑證和/或其鏈結不相符。

診斷

  1. 登入 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>
    
  2. 決定虛擬主機中使用的 Truststore 參照。

    在上述範例中,Truststore 參考名稱為 myCompanyTruststoreRef

  3. 決定 Truststore 參照所指出的 Truststore。
    1. 在 Edge UI 中,依序前往「Admin」>環境參考資料 並搜尋 Truststore 參考名稱。
    2. 記下特定 Truststore 參照的「Reference」欄中的名稱。 這會成為您的 Truststore 名稱。

      顯示邊緣 UI
        信任存放區參照
      圖 5

      在上述範例中,請注意 myCompanyTruststoreRef 的 參照 myCompanyTruststore。因此 Truststore 名稱為 myCompanyTruststore。

  4. 使用下列 API 取得儲存在 Truststore 中的憑證 (如上一個步驟中決定):
    1. 列出 KeyStore 或 Truststore API 的憑證

      這個 API 會列出特定 Truststore 中的所有憑證。

    2. 從 KeyStore 或 Truststore API 取得憑證詳細資料

      這個 API 會傳回特定 Truststore 中特定憑證的相關資訊。

  5. 檢查各憑證的核發者和主體,以及各個憑證儲存在哪個鏈結中的主體 myCompanyTruststore 與憑證及其鏈結中的憑證相符 中所述的通訊埠數量 (參照封包 #38)。如果有不相符 上傳至信任存放區的憑證並未在 Edge Router 中載入。 移至「原因:未在 Edge Router 中載入用戶端憑證」
  6. 如果步驟 5 中沒有不相符的項目,表示用戶端應用程式 未傳送正確的憑證及其鏈結。

解析度

確認用戶端應用程式已將正確的憑證及其鏈結傳送至 Edge。

原因:Truststore 中缺少用戶端根憑證

如果 Edge 路由器的信任儲存庫

診斷

  1. 登入 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>
    
  2. 決定虛擬主機中使用的信任儲存庫參照。在先前的範例中 信任儲存庫參照名稱為 myCompanyTruststoreRef
  3. 確定信任儲存庫參照使用的實際信任儲存庫。
  4. 在 Edge UI 中,依序前往「Admin」>環境 >參考資料和搜尋 。
  5. 特定信任儲存庫參照的信任儲存庫名稱位於 參考資料欄。

    圖 6

    在這個範例中,請注意 myCompanyTruststoreRef 已 「參考資料」欄中的 myCompanyTruststore。因此 Truststore 名稱為 myCompanyTruststore

  6. 使用 並支援下列 API:
    1. 列出 KeyStore 或 Truststore API 的憑證。這個 API 會列出 憑證
    2. 從 KeyStore 或 Truststore API 取得憑證詳細資料。這個 API 會傳回 特定憑證
  7. 檢查憑證是否包含完整鏈結 (包括根憑證) 來自特定用戶端,如 TCP/IP 封包中所顯示的內容 (請見圖 4)。信任儲存庫 必須包含根憑證,以及用戶端的分葉憑證或分葉,且 中繼憑證如果信任儲存庫中缺少用戶端的有效根憑證, 或是導致錯誤的原因

    不過,如果用戶端的完整憑證鏈結 (包括根憑證) 存在,表示該憑證已上傳到 信任儲存庫可能無法在 Edge Router 中載入。在此情況下,請參閱 原因:未在 Edge Router 中載入用戶端憑證

解析度

確認可用的用戶端憑證 (包括根憑證) 可用 位於 Apigee Edge 路由器的信任存放區中

原因:未在 Edge Router 中載入用戶端憑證

  1. 如果您是公用雲端使用者,請與 Apigee Edge 支援團隊聯絡。
  2. 如果您是 Private Cloud 使用者,請在每個路由器上按照下列指示操作:
    1. 檢查「/opt/nginx/conf.d/OrgName_envName_vhostName-client.pem」檔案是否存在 套用至特定虛擬主機的 Cookie如果檔案不存在,請移至 解決方法」一節。
    2. 如果檔案存在,請使用下列 openssl 指令取得 邊緣路由器可用的憑證:
      openssl -in <OrgName_envName_vhostName-client.pem> -text -noout
    3. 查看憑證的核發機構、主旨和到期日。如果有任何一組不符合 與 Edge UI 中的 Truststore 搭配使用,或是使用管理 API 錯誤原因
    4. 可能是路由器未重新載入上傳的憑證。

解析度

請按照下列步驟重新啟動路由器,確保系統已載入最新憑證:

apigee-service edge-router restart

請重新執行 API 並檢查結果。如果問題仍未解決,請前往 收集診斷資訊

收集診斷資訊

按照上述說明操作後,如果問題仍未解決,請收集下列診斷資訊。 與 Apigee Edge 支援聯絡並分享您收集的資訊:

  1. 如果您是公有雲使用者,請提供下列資訊:
    1. 機構名稱
    2. 環境名稱
    3. API Proxy 名稱
    4. 虛擬主機名稱
    5. 主機別名名稱
    6. 完成 curl 指令即可重現錯誤
    7. 用戶端應用程式擷取的 TCP/IP 封包數
  2. 如果您是 Private Cloud 使用者,請提供以下資訊:
    1. 使用 Get virtual host API 定義虛擬主機名稱及其定義
    2. 主機別名名稱
    3. 觀察到完整的錯誤訊息
    4. 用戶端應用程式或路由器擷取的 TCP/IP 封包。
    5. 列出 KeyStore API 中的憑證的輸出內容 API 和 Get cert details API 取得的所有憑證詳細資料。
  3. 詳細說明您試過哪些應對手冊的章節,以及有哪些其他分析資訊 能快速解決這個問題