發生傳輸層安全標準 (TLS) 錯誤,API 呼叫失敗

本頁內容適用於 Apigee 和 Apigee Hybrid。

查看 Apigee Edge 說明文件。

問題

Apigee hybrid API 要求失敗,並顯示 TLS 連線錯誤。這類錯誤通常是連線重設和警示信號交換失敗。

錯誤訊息

API 呼叫失敗,並顯示類似下列錯誤的傳輸層安全標準 (TLS) 錯誤,或顯示其他但不完全相同的錯誤:

* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.apis.com:443
* Closing connection 0
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.apis.com:443
* (304) (OUT), TLS handshake, Client hello (1):
* Recv failure: Connection reset by peer
* LibreSSL/3.3.6: error:02FFF036:system library:func(4095):Connection reset by peer
* Closing connection
curl: (35) Recv failure: Connection reset by peer
* (304) (OUT), TLS handshake, Client hello (1):
* LibreSSL/3.3.6: error:1404B410:SSL routines:ST_CONNECT:sslv3 alert handshake failure
* Closing connection
curl: (35) LibreSSL/3.3.6: error:1404B410:SSL routines:ST_CONNECT:sslv3 alert handshake failure

可能原因

原因 說明 適用於以下裝置的疑難排解說明
缺少 Ingress Kubernetes 密鑰 Apigee 命名空間缺少 org-envgroup 的 Kubernetes Secret。 Apigee Hybrid
SSL 憑證格式不正確 覆寫檔案的虛擬主機部分所指的 SSL 憑證格式有誤。 Apigee Hybrid
SSL 金鑰與 SSL 憑證不符 SSL 金鑰與覆寫檔案虛擬主機部分所指的 SSL 憑證不符。 Apigee Hybrid

原因:缺少 Ingress Kubernetes Secret

診斷

  1. 分析 apigee 命名空間中 apigee-watcher Pod 的記錄,查看是否有任何錯誤。

    您可能會看到下列錯誤:
    NOT_FOUND: failed to get secret "MY_HYBRID_PROJECT-ENV_GROUP"
    in namespace "apigee": secrets "MY_HYBRID_PROJECT-ENV_GROUP" not found
    其中:
    • MY_HYBRID_PROJECT 是 Apigee Hybrid 機構的名稱
    • ENV_GROUP 是環境群組的名稱。
    上述錯誤表示 apigee-watcher 找不到 Apigee Hybrid 機構上述環境群組的 Kubernetes 密鑰。
  2. 使用下列指令,確認 Kubernetes Secret 是否確實遺失:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
    <no output>
    這個範例顯示沒有 Kubernetes Secret 可供 MY_HYBRID_PROJECT-ENV_GROUP 使用。這些項目可能遭到誤刪。

解析度

您可以使用 overrides.yaml 檔案中的 TLS 憑證和金鑰檔案資訊,重新建立缺少的 Kubernetes 密鑰:

  1. 執行下列指令,使用 Helm 重新建立遺失的密鑰:

    模擬測試:

    helm upgrade ENV_GROUP_RELEASE_NAME apigee-virtualhost/ \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    --set envgroup=ENV_GROUP \
    -f OVERRIDES_FILE \
    --dry-run=server
    

    請務必加入顯示的所有設定,包括 --atomic ,以便在動作失敗時回溯。

    您的安裝項目可能或可能未使用與 ENV_GROUP 不同的 ENV_GROUP_RELEASE_NAME 設定。如需設定相關資訊,請參閱「使用 Helm 安裝 Apigee Hybrid」。

    安裝圖表:

    helm upgrade ENV_GROUP_RELEASE_NAME apigee-virtualhost/ \
    --namespace APIGEE_NAMESPACE \
    --atomic \
    --set envgroup=ENV_GROUP \
    -f OVERRIDES_FILE
    
  2. 使用下列指令,確認 Kubernetes 密鑰是否已順利建立:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP

    這項指令的輸出內容應如下所示:

    MY_HYBRID_PROJECT-ENV_GROUP                   Opaque                2      7s

如果問題仍未解決,請參閱「必須收集的診斷資訊」。

原因:SSL 憑證格式不正確

診斷

首先,請確認憑證檔案為 .PEM 檔案。如要檢查格式正確的 SSL 憑證是否已載入 apigee-ingressgateway,請按照下列步驟操作。

如果您已按照方法 1:金鑰/憑證組所述,使用憑證/金鑰組設定單向 TLS,請執行下列指令:

openssl x509 -in $CERT_FILE -text -noout

輸出內容範例 (沒有錯誤):

Certificate:
  Data:
    Version: 1 (0x0)
    Serial Number: 1 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
    Issuer: C = US, O = xyz, OU = abc, CN = INTERIM-CN
    Validity
      Not Before: Dec 18 09:40:23 2023 GMT
      Not After : May  1 09:40:23 2025 GMT
    Subject: C = US, O = xyz, OU = abc, CN = shrey.example.com
    Subject Public Key Info:
      Public Key Algorithm: rsaEncryption
        RSA Public-Key: (2048 bit)
        Modulus:
          Trimmed
        Exponent: 65537 (0x10001)
    Signature Algorithm: sha1WithRSAEncryption
          Trimmed

如果您已使用 Kubernetes 密鑰設定單向 TLS,如選項 2:Kubernetes 密鑰所述,請執行下列指令:

kubectl -n apigee get secret <$SECRET_NAME> -o jsonpath='{.data.cert}'| base64 -d > certfile ;
openssl x509 -in certfile -text -noout

kubectl -n apigee get secret <$SECRET_NAME> -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -text

輸出內容範例 (無錯誤):

Certificate:
  Data:
    Version: 1 (0x0)
    Serial Number: 1 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
    Issuer: C = US, O = xyz, OU = abc, CN = INTERIM-CN
    Validity
      Not Before: Dec 18 09:40:23 2023 GMT
      Not After : May  1 09:40:23 2025 GMT
    Subject: C = US, O = xyz, OU = abc, CN = shrey.example.com
    Subject Public Key Info:
      Public Key Algorithm: rsaEncryption
        RSA Public-Key: (2048 bit)
        Modulus:
          Trimmed
        Exponent: 65537 (0x10001)
  Signature Algorithm: sha1WithRSAEncryption
          Trimmed

如果上述指令的輸出內容如下所示:

unable to load certificate
136613728412992:error:0D078095:asn1 encoding routines:asn1_item_embed_d2i:sequence not constructed:../crypto/asn1/tasn_dec.c:321:Type=X509
136613728412992:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:../crypto/pem/pem_oth.c:33:

如要解決

error loading certificates
8360934016:error:09FFF066:PEM routines:CRYPTO_internal:bad end line

請參閱「解決方案」一節。

解析度

錯誤可能因憑證檔案的格式錯誤而異。 視需要修正憑證錯誤。

如果輸出內容顯示憑證而非錯誤,請考慮原因:SSL 金鑰與 SSL 憑證不符。

原因:SSL 金鑰與 SSL 憑證不符

診斷

如果您已使用憑證/金鑰組設定單向 TLS,如「選項 1:金鑰/憑證組」所述,請執行下列指令:

diff -q <(openssl rsa -noout -modulus -in $KEY_FILE ) <(openssl x509 -noout -modulus -in $CERT_FILE)

輸出內容範例 (無錯誤):

diff -q <(openssl rsa -noout -modulus -in my_server.key ) <(openssl x509 -noout -modulus -in my_server.pem)
<No output>

如果您已使用 Kubernetes 密鑰設定單向 TLS,如選項 2:Kubernetes 密鑰所述,請執行下列指令:

diff -q <(kubectl -n apigee get secrets $SECRET_NAME -o jsonpath='{.data.key}'| base64 -d | openssl rsa -noout -modulus) <(kubectl -n apigee get secrets $SECRET_NAME -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -modulus)

輸出內容範例 (無錯誤):

diff -q <(kubectl -n apigee get secrets my-apigee-hybrid-env-grp -o jsonpath='{.data.key}'| base64 -d | openssl rsa -noout -modulus) <(kubectl -n apigee get secrets my-apigee-hybrid-env-grp -o jsonpath='{.data.cert}'| base64 -d | openssl x509 -noout -modulus)
<No output>

如果上述指令的輸出內容顯示類似下列的錯誤:

unable to load Private Key
133504499987776:error:09091064:PEM routines:PEM_read_bio_ex:bad base64 decode:../crypto/pem/pem_lib.c:949:
Files /dev/fd/63 and /dev/fd/62 differ

則表示 SSL 金鑰與 SSL 憑證不符,請參閱「解決方案」一節。

解析度

請確認您提供的私密金鑰和對應的 SSL 憑證正確無誤。修正私密金鑰和 SSL 憑證問題。

如果沒有任何指令輸出內容,表示 SSL 憑證和 SSL 金鑰相符。

必須收集診斷資訊

如果按照本頁的指示操作後問題仍未解決,請收集下列診斷資訊,並提供給 Apigee 支援團隊:

  1. 顯示錯誤的完整 curl 詳細輸出內容。
  2. 在發生錯誤的電腦上擷取 tcpdump,並移除任何私密資訊和 IP 位址後再分享。
  3. 與網路團隊諮詢後,準備好整個網路拓撲和網路流程,並分享給 Apigee 支援團隊。