API 调用失败并显示 TLS 错误

您正在查看 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 Secret Apigee 命名空间中缺失 org-envgroup 的 Kubernetes Secret。 Apigee Hybrid
SSL 证书格式不正确 替换文件的 virtualhosts 部分中指向的 SSL 证书格式不正确。 Apigee Hybrid
SSL 密钥与 SSL 证书不匹配 SSL 密钥与替换文件的 virtualhosts 部分中指向的 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 Secret。
  2. 使用以下命令验证 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:

  1. 运行以下命令以重新创建缺失的密钥:
    apigeectl apply -f overrides/overrides.yaml --settings virtualhosts

    上述命令的输出应显示密钥已创建:

    secret/MY_HYBRID_PROJECT-ENV_GROUP created
  2. 使用以下命令验证 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 支持

  1. 显示错误的整个 curl 详细输出。
  2. 在显示错误的机器上捕获 tcpdump,并通过移除所有敏感信息和 IP 地址来共享它。
  3. 在咨询网络团队后,准备好整个网络拓扑和网络流,以与 Apigee 支持团队共享。