400 無效要求 - SSL 憑證錯誤

您目前查看的是 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」訊息。

診斷

  1. 登入 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>
  2. 判斷虛擬主機中使用的信任儲存區參照。在上述範例中,信任儲存庫參照名稱為 myTruststoreRef

  3. 判斷 Truststore 參考資料所指向的 Truststore。
    1. 在 Edge UI 中,依序前往「Admin」>「Environments」>「References」 ,然後搜尋 Truststore 參照名稱。
    2. 請記下特定信任儲存區參照的「Reference」欄中的名稱。 這會是 Truststore 名稱。

      Edge 使用者介面,顯示參照清單
      圖 1

      在上述範例中,請注意 myTruststoreRef 參照 myTruststore。因此,信任儲存庫名稱為 myTruststore

  4. 在 Edge UI 的「管理」>「環境」>「傳輸層安全標準 (TLS) 金鑰儲存區」中,前往「傳輸層安全標準 (TLS) 金鑰儲存區」,然後尋找步驟 3 中找到的信任儲存區。
  5. 在特定信任儲存區 (如上述步驟 3 所判斷) 下方選取憑證,如下所示:

    圖 2

    上述範例中別名為 client-cert-markw 的憑證已過期。

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

解析度

取得新憑證並上傳:

  1. 建立新的信任儲存區,例如 myNewTruststore
  2. 將新憑證上傳至新建立的信任儲存區。
  3. 按照「修改參照」一文中的步驟,修改特定虛擬主機中使用的信任儲存庫參照,指向新的信任儲存庫。

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

其他原因的常見診斷步驟

  1. 如要調查這個問題,請使用 tcpdump 工具擷取 TCP/IP 封包。
    1. 如果您是 Private Cloud 使用者,則可以在用戶端應用程式或路由器上擷取 TCP/IP 封包。
    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 封包,請在 tcpdump 指令中使用虛擬主機中使用的主機名稱公開 IP 位址。

      如要進一步瞭解這項工具和這個指令的其他變體,請參閱 tcpdump

  2. 使用 Wireshark 工具或您熟悉的類似工具,分析收集到的 TCP/IP 封包。

以下是使用 Wireshark 工具分析的 TCP/IP 封包資料範例:

  1. tcpdump 中的封包 #30 (下圖) 顯示,用戶端應用程式 (來源) 已將「Client Hello」訊息傳送至路由器 (目的地)。
  2. 封包 #34 顯示路由器確認來自用戶端應用程式的 Client Hello 訊息。
  3. 路由器會在封包 #35 中傳送「Server Hello」,然後傳送自己的憑證,並在封包 #38 中要求用戶端應用程式傳送憑證。
  4. 在封包 #38 中,路由器會傳送「憑證要求」封包,請檢查「識別名稱」部分,其中提供用戶端憑證、憑證鏈結,以及路由器 (伺服器) 接受的憑證授權單位詳細資料。
  5. 圖 3
  6. 用戶端應用程式會在封包 # 41 中傳送憑證。檢查封包 # 41 中的「Certificate Verify」(憑證驗證) 部分,判斷用戶端應用程式傳送的憑證。

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

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

如果用戶端應用程式傳送的憑證和/或憑證鏈結主體/簽發者,與路由器 (伺服器) 信任存放區中儲存的憑證和/或憑證鏈結不符,通常就會發生這種情況。

診斷

  1. 登入 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>
  2. 判斷虛擬主機中使用的信任儲存區參照。

    在上述範例中,信任儲存庫參照名稱為 myCompanyTruststoreRef

  3. 判斷 Truststore 參考資料所指向的 Truststore。
    1. 在 Edge UI 中,依序前往「管理」>「環境參照」 ,然後搜尋信任儲存區參照名稱。
    2. 請記下特定信任儲存區參照的「參照」欄中的名稱。 這會是 Truststore 名稱。

      Edge UI 顯示信任儲存區參照。
      圖 5

      在上述範例中,請注意 myCompanyTruststoreRef 參照了 myCompanyTruststore。因此,信任儲區名稱為 myCompanyTruststore。

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

      這個 API 會列出特定信任儲存區中的所有憑證。

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

      這個 API 會傳回特定信任儲存區中特定憑證的相關資訊。

  5. 檢查 myCompanyTruststore 中儲存的每個憑證及其鏈結的簽發者和主體,是否與上述 TCP/IP 封包 (請參閱封包 #38) 中的憑證及其鏈結相符。如果兩者不符,表示上傳至信任儲存庫的憑證未載入 Edge 路由器。請前往「原因:用戶端憑證未載入 Edge 路由器」。
  6. 如果在步驟 5 中未發現不符情況,表示用戶端應用程式未傳送正確的憑證及其鏈結。

解析度

確認用戶端應用程式傳送至 Edge 的憑證和憑證鏈正確無誤。

原因:信任儲存庫中缺少用戶端根憑證

如果 Edge 路由器信任儲存區中缺少用戶端 CA 簽署的根憑證,就會擲回這項錯誤。

診斷

  1. 登入 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>
  2. 判斷虛擬主機中使用的信任儲存庫參照。在上述範例中,信任儲存庫參照名稱為 myCompanyTruststoreRef
  3. 判斷信任儲存庫參照使用的實際信任儲存庫。
  4. 在 Edge UI 中,依序前往「管理」>「環境」>「參照」,然後搜尋信任儲存區參照名稱。
  5. 特定信任儲存庫參照的信任儲存庫名稱位於「參照」欄。

    圖 6

    在本範例中,請注意「Reference」欄中的 myCompanyTruststoreRef 具有 myCompanyTruststore。因此,信任儲存庫名稱為「myCompanyTruststore」myCompanyTruststore

  6. 使用下列 API 取得儲存在信任儲存區 (在上一個步驟中決定) 的憑證:
    1. 列出 KeyStore 或信任儲存庫 API 的憑證。這個 API 會列出信任儲存區中的所有憑證。
    2. 從 KeyStore 或 TrustStore API 取得憑證詳細資料。這個 API 會傳回信任儲存區中特定憑證的相關資訊。
  7. 檢查憑證是否包含完整鏈結,包括特定用戶端傳送的根憑證 (如 TCP/IP 封包所示,請參閱圖 4)。信任儲存庫必須包含根憑證,以及用戶端的分葉憑證或分葉和中繼憑證。如果信任儲存區缺少用戶端的有效根憑證,就會導致錯誤。

    不過,如果信任儲存區中存在用戶端的完整憑證鏈結 (包括根憑證),則表示上傳至信任儲存區的憑證可能未載入 Edge 路由器。如果是這種情況,請參閱「原因:用戶端憑證未載入 Edge 路由器」。

解析度

請確認 Apigee Edge 路由器的信任儲存庫中,有正確的用戶端憑證 (包括根憑證)。

原因:用戶端憑證未載入 Edge 路由器

  1. 如果您是公有雲使用者,請與 Apigee Edge 支援團隊聯絡。
  2. 如果您是 Private Cloud 使用者,請按照下列說明操作每個路由器:
    1. 檢查特定虛擬主機的檔案 /opt/nginx/conf.d/OrgName_envName_vhostName-client.pem 是否存在。如果檔案不存在,請參閱下方的「解決方法」一節。
    2. 如果檔案存在,請使用下列 openssl 指令,取得 Edge 路由器上可用憑證的詳細資料:
      openssl -in <OrgName_envName_vhostName-client.pem> -text -noout
    3. 檢查憑證的核發者、主體和到期日。如果這些項目與 Edge UI 或管理 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 的輸出內容,以及使用「取得憑證詳細資料 API」取得的每個憑證詳細資料。
  3. 您已嘗試使用本 Playbook 中的哪些章節,以及任何其他有助於我們加快解決這個問題的洞察資訊。