您正在查看 Apigee 和 Apigee 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 密鑰
診斷
- 請分析 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 密鑰。 - 使用下列指令,確認 Kubernetes 秘密確實遺失:
kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
<no output>
這個範例顯示MY_HYBRID_PROJECT-ENV_GROUP
沒有任何 Kubernetes 密鑰。這些項目可能已誤刪。
解決方法
您可以使用 overrides.yaml
檔案中的 TLS 憑證和金鑰檔案資訊,重新建立缺少的 Kubernetes 密鑰:
- 執行下列指令,使用 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
- 使用下列指令,確認 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 支援團隊:
- 您看到錯誤的完整
curl
詳細輸出內容。 - 請在出現錯誤的電腦上擷取
tcpdump
,然後移除任何機密資訊和 IP 位址再分享。 - 請與網路團隊討論,並準備好整個網路拓撲和網路流程,以便與 Apigee 支援團隊分享。