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

您正在查看 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

問題

Apigee 混合式 API 要求失敗,並發生 TLS 連線錯誤。這些錯誤通常是連線重設和警示握手失敗。

錯誤訊息

發生 TLS 錯誤,API 呼叫失敗,類似於下列錯誤,或其他類似錯誤:

* 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 憑證 在覆寫檔案的 virtualhosts 區段中,所指向的 SSL 憑證格式不正確。 Apigee Hybrid
SSL 金鑰與 SSL 憑證不符 SSL 金鑰與覆寫檔案 virtualhosts 區段中所指向的 SSL 憑證不符。 Apigee Hybrid

原因:缺少 Ingress Kubernetes 密鑰

診斷

  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 混合機構上述環境群組的 Kubernetes 密鑰。
  2. 使用下列指令,確認 Kubernetes 秘密確實遺失:
    kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
    <no output>
    這個範例顯示 MY_HYBRID_PROJECT-ENV_GROUP 沒有任何 Kubernetes 密鑰。這些項目可能已誤刪。

解決方法

您可以使用 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

如果您已按照「選項 2:Kubernetes 密鑰」所述,使用 Kubernetes 密鑰設定單向 TLS,請執行以下命令:

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>

如果您已按照「選項 2:Kubernetes 密鑰」所述,使用 Kubernetes 密鑰設定單向 TLS,請執行以下命令:

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