400 無效要求 - SSL 憑證錯誤

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

問題

用戶端應用程式會收到「HTTP 400 - 不良要求」回應,以及「SSL 憑證錯誤」訊息。這個錯誤通常是由 Edge Router 透過啟用傳輸層安全標準 (TLS) 設定以用於傳入 Apigee Edge 的連線方式傳送。

錯誤訊息

用戶端應用程式會取得以下回應代碼:

HTTP/1.1 400 Bad Request

如下所示:

<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 中缺少用戶端根憑證 如果用戶端的 CA 簽署根憑證不在 Edge 路由器的信任儲存庫中,系統就會擲回這個錯誤。 邊緣私有雲和公有雲使用者
未在邊緣路由器中載入用戶端憑證 如果上傳到信任儲存庫的用戶端憑證沒有在路由器上載入,系統就會擲回這個錯誤。 Edge Private Cloud 使用者

原因:用戶端憑證已過期

這個問題通常發生在雙路傳輸層安全標準 (TLS),也就是用戶端傳送的憑證過期時。在雙向傳輸層安全標準 (TLS) 中,用戶端和伺服器會交換公開憑證,完成握手。用戶端會驗證伺服器憑證,伺服器也會驗證用戶端憑證。

在 Edge 中,系統會在「虛擬主機」實作雙向 TLS,將伺服器憑證新增至 KeyStore,並將用戶端憑證新增至信任儲存庫。

在 TLS 握手期間,如果發現用戶端憑證已過期,伺服器就會傳送「400 - 不正確的要求」訊息,並顯示「SSL 憑證錯誤」的訊息。

診斷

  1. 登入 Edge UI,然後查看要發出 API 要求的特定虛擬主機設定 (依序點選「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://myTruststoreRef</TrustStore>
        </SSLInfo>
    </VirtualHost>
    
  2. 決定虛擬主機中使用的 Truststore 參照。在上述範例中,Truststore 參照名稱為 myTruststoreRef

  3. 確定 Truststore 參照指向的 Truststore。
    1. 在 Edge UI 中,依序前往「管理」>「環境」>「參考資料」,並搜尋 Truststore 參考名稱。
    2. 記下「參考資料」欄中的名稱,即可查看特定 Truststore 參考資料。 這會是您的 Truststore 名稱。

      顯示參照清單的 Edge UI
      圖 1

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

  4. 在 Edge UI 的「管理」>「環境」>「TLS KeyStore」中,前往 TLS KeyStore,然後尋找步驟 3 中的 Truststore。
  5. 選取特定 Truststore 下的憑證 (如上述步驟 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 的封包 #38 中,路由器傳送「憑證要求」封包,查看「唯一名稱」部分,其中提供了路由器 (伺服器) 接受的用戶端憑證、其鏈結和憑證授權單位的詳細資料。
  5. 圖 3
  6. 用戶端應用程式將其憑證以封包 # 41 中傳送。查看封包 # 41 中的「憑證驗證」部分,然後找出用戶端應用程式傳送的憑證。

    圖 4
  7. 確認用戶端應用程式傳送的憑證和鏈結核發者 (封包 #41) 是否與已接受的憑證及其鏈結符合路由器 (封包 #38) 中的憑證。如果出現不相符的情形,則可能是造成這個錯誤的原因。因此路由器 (伺服器) 會傳送加密警示 (封包 #57),後面接著 FIN、ACK (封包 58) 至用戶端應用程式,最終會終止連線。
  8. 憑證及其鏈結不符的原因可能是下列各節所述。

原因:用戶端傳送的憑證不正確

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

診斷

  1. 登入 Edge UI,然後查看要發出 API 要求的特定虛擬主機設定 (依序點選「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 中,依序前往「管理」>「環境參考資料」,並搜尋 Truststore 參考名稱。
    2. 記下「參考資料」欄中的名稱,即可查看特定 Truststore 參考資料。 這會是您的 Truststore 名稱。

      顯示信任儲存庫參考資料的邊緣 UI。
      圖 5

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

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

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

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

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

  5. 檢查儲存在 myCompanyTruststore 中每個憑證及其鏈結的核發者和主體,是否與上述 TCP/IP 封包 (參考封包 #38) 中顯示的憑證及其鏈結相符。如果不相符,代表上傳到信任儲存庫的憑證並未在邊緣路由器中載入。移至「原因:未載入邊緣路由器的用戶端憑證」
  6. 如果在步驟 #5 中找不到任何不相符情形,表示用戶端應用程式未傳送正確的憑證及其鏈結。

解析度

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

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

如果用戶端的 CA 簽署根憑證不在 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」>「Environments」>「References」,然後搜尋 Truststore 參考名稱。
  5. 特定信任儲存庫參照的信任儲存庫名稱位於「參考資料」欄中。

    圖 6

    在本範例中,請注意 myCompanyTruststoreRef 的「參考資料」欄中有 myCompanyTruststore。因此,信任儲存庫的名稱是 myCompanyTruststore

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

    然而,如果用戶端的完整憑證鏈結 (包括根憑證) 存在於信任儲存庫中,就表示可能尚未在邊緣路由器中載入上傳到信任存放區的憑證。如果是這種情況,請參閱原因:未載入邊緣路由器的用戶端憑證

解析度

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

原因:在邊緣路由器中未載入用戶端憑證

  1. 如果您是公開雲端使用者,請與 Apigee Edge 支援團隊聯絡。
  2. 如果您是 Private Cloud 使用者,請參考下列每個路由器的說明:
    1. 檢查特定虛擬主機是否有 /opt/nginx/conf.d/OrgName_envName_vhostName-client.pem 檔案。如果檔案不存在,請移至下方的「Resolution」部分。
    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. 如果您是私有雲使用者,請提供下列資訊:
    1. 使用 Get virtual Host API 定義虛擬主機名稱及其定義
    2. 主機別名名稱
    3. 發現完整錯誤訊息
    4. 在用戶端應用程式或路由器上擷取的 TCP/IP 封包。
    5. 「列出來自 KeyStore API 的憑證」的輸出內容,以及使用 取得憑證詳細資料 API 取得的每個憑證詳細資料。
  3. 詳細說明您曾在本教戰手冊中嘗試的章節,以及任何有助我們快速解決這個問題的深入分析。