您正在查看 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 Secret | Apigee 命名空间中缺失 org-envgroup 的 Kubernetes Secret。 |
Apigee Hybrid |
SSL 证书格式不正确 | 替换文件的 virtualhosts 部分中指向的 SSL 证书格式不正确。 | Apigee Hybrid |
SSL 密钥与 SSL 证书不匹配 | SSL 密钥与替换文件的 virtualhosts 部分中指向的 SSL 证书不匹配。 | Apigee Hybrid |
原因:缺失 Ingress Kubernetes Secret
诊断
- 分析 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 Secret。 - 使用以下命令验证 Kubernetes Secret 是否确实缺失:
kubectl -n apigee get secrets | grep MY_HYBRID_PROJECT-ENV_GROUP
<no output>
此示例未显示MY_HYBRID_PROJECT-ENV_GROUP
的 Kubernetes Secret。这些内容可能被错误地删除。
解决方法
您可以使用 overrides.yaml
文件中的 TLS 证书和密钥文件信息重新创建缺失的 Kubernetes Secret:
- 运行以下命令以重新创建缺失的密钥:
apigeectl apply -f overrides/overrides.yaml --settings virtualhosts
上述命令的输出应显示密钥已创建:
secret/MY_HYBRID_PROJECT-ENV_GROUP created
- 使用以下命令验证 Kubernetes Secret 是否已成功创建:
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 Secret 中所述的 Kubernetes Secret 配置了单向 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 Secret 中所述的 Kubernetes Secret 配置了单向 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 支持团队共享。