API 调用失败并显示 TLS 错误

您正在查看 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

诊断

  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. 运行以下命令以使用 Helm 重新创建缺失的 Secret:

    试运行:

    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 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 支持团队共享。