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

您目前查看的是 ApigeeApigee 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 密鑰確實遺失:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
    <no output>
    這個範例顯示 MY_HYBRID_PROJECT-ENV_GROUP 沒有 Kubernetes Secret。這些項目可能遭到誤刪。

解析度

您可以使用 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 憑證不符

診斷

如果您已按照「選項 1:金鑰/憑證組」一節所述,使用憑證/金鑰組設定單向傳輸層安全標準 (TLS),請執行下列指令:

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 支援團隊。