502 Bad Gateway - 自签名证书链

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档
信息

问题

客户端应用收到 HTTP 响应代码 502,其中包含消息 Bad Gateway,以此响应 Edge Microgateway 中的 API 调用。

或者,管理员在运行 edgemicro configure 命令时会收到 self signed certificate in certificate chain 错误。

出错提示

客户端将看到以下响应消息:

HTTP/1.1 502 Bad Gateway

以下是两种常见的错误响应示例:

{"message":"self signed certificate in certificate chain","code":"SELF_SIGNED_CERT_IN_CHAIN"}
{"message":"self signed certificate","code":"DEPTH_ZERO_SELF_SIGNED_CERT"}

或者,运行 edgemicro configure 时可能会出现此错误:

{ Error: self signed certificate in certificate chain
at TLSSocket.onConnectSecure (_tls_wrap.js:1051:34)
at TLSSocket.emit (events.js:189:13)
at TLSSocket._finishInit (_tls_wrap.js:633:8) code: 'SELF_SIGNED_CERT_IN_CHAIN' }

可能的原因

原因 说明 适用的问题排查说明
目标服务器提供自签名证书 Edge Microgateway 将验证目标服务器的证书,如果该证书不受信任,则会引发运行时错误。 Edge Public 和 Private Cloud 用户
Apigee Edge 管理服务器使用自签名证书 首次配置 Edge Microgateway 时,它会通过 TLS 连接到 Apigee Edge 以进行启动。如果 Edge 呈现自签名证书,则此测试将失败。 Edge Private Cloud 用户

原因:目标服务器提供的是自签名证书

如果目标服务器在 南向连接中提供 自签名证书,Edge Microgateway 默认会引发此错误,因为它不信任自签名证书。

诊断

您可能会在日志 (/var/tmp/edgemicro-`hostname`- *.log) 中看到以下错误:

2021-05-18T10:52:46.425Z [error][0:8000][1][gsc][test][edgemicro_badtargethost][][][2db53f80-
b7c7-11eb-9abe-05b6297863f1][microgateway-core][][GET][502][self signed certificate in certificate
chain][SELF_SIGNED_CERT_IN_CHAIN][]

错误代码 SELF_SIGNED_CERT_IN_CHAIN 表示 Edge Microgateway 很可能已从目标服务器收到自签名证书。如需确认这一点,请执行以下步骤:

  1. 运行以下 openssl 命令,验证目标服务器的证书链:
    echo | openssl s_client -connect TARGET_SERVER_HOSTNAME:PORT -servername TARGET_SERVER_HOSTNAME | openssl x509 -noout
    
  2. 如果目标服务器的证书链确实是自签名的,那么这就是问题的原因。

    在以下示例中,请注意目标服务器会提供自签名证书:

    echo | openssl s_client -connect untrusted-root.badssl.com:443 -servername untrusted-root.badssl.com | openssl x509 -noout
    
    depth=1 C = US, ST = California, L = San Francisco, O = BadSSL, CN = BadSSL Untrusted Root Certificate Authority
    verify error:num=19:self signed certificate in certificate chain
    verify return:0
    DONE

分辨率

  1. 与目标服务器的所属团队合作,获取由可信的证书授权机构 (CA) 签发的适当 TLS 证书。
  2. 如果无法做到这一点,请考虑以下选项之一,以允许在 Edge Microgateway 中使用自签名证书。

    选项 1:设置系统属性以允许 Edge Microgateway 信任所有证书

    1. 如果您使用的是 Docker,请参阅 使用不受 Node.js 信任的 CA
    2. 否则,请导出名为 NODE_EXTRA_CA_CERTS 的环境变量,指向根 CA 文件。

      官方 Node.js 网站上对此进行了说明。

    选项 2:配置 Edge Microgateway YAML 配置文件,以信任该目标服务器的特定证书

    1. 确保您拥有目标服务器的证书(或证书链),且证书采用 PEM 格式。如需将其他证书格式转换为 PEM,请按照 将证书转换为支持的格式中的说明操作。
    2. 如果存在证书链,请确保证书的顺序正确无误。叶证书应始终位于最前面,后面依次是中间证书和根证书。如需详细了解,请参阅 验证证书链

      在以下示例中,我们为 untrusted-root.badssl.com 配置了可信 CA 文件。

      edgemicro:
      ...
      targets:
        - host: 'untrusted-root.badssl.com'
          ssl:
            client
              ca: /opt/apigee/certs/untrusted-root.pem

    有关如何配置此功能的说明,请参阅 Edge Microgateway 模块 - 配置单向和双向南向 TLS 视频。 如需了解详情,请参阅 在 Edge Microgateway 服务器上配置 SSL

如果问题仍然存在,请转到必须收集诊断信息

原因:Apigee Edge 管理服务器使用自签名证书

首次设置 Edge Microgateway 时,您需要运行的命令之一是 edgemicro configureedgemicro private configure。此命令将引导集群,并与 Apigee Edge 联系以下载所需的信息。

对于 Edge Private Cloud,管理服务器网址由 -m 实参确定。 如果您已为管理服务器启用 TLS,则 Edge Microgateway 会尝试验证管理服务器提供的证书。

以下是 Edge Private Cloud 的 edgemicro configure 命令示例:

edgemicro private configure -u <username> -p <password> -o apigee -e dev -v secure -r https://apigee-dev.net -m https://management.apigee-dev.net:8443

如果管理服务器配置了自签名证书,您将在控制台输出中看到以下错误。

{ Error: self signed certificate in certificate chain
at TLSSocket.onConnectSecure (_tls_wrap.js:1051:34)
at TLSSocket.emit (events.js:189:13)
at TLSSocket._finishInit (_tls_wrap.js:633:8) code: 'SELF_SIGNED_CERT_IN_CHAIN' }

诊断

  1. 在这种情况下,管理服务器 (management.apigee-dev.net) 可能会返回自签名 TLS 证书。
  2. 您的 Apigee Edge 系统管理员很可能已提供证书,并且拥有该证书的副本。
  3. 否则,请运行以下命令以获取有关证书的信息:
    echo | openssl s_client -connect management.apigee-dev.net:8443 -servername management.apigee-dev.net | openssl x509 -noout
    
  4. 如果管理服务器具有自签名证书,则会导致此问题。

分辨率

  1. 与目标服务器的所属团队合作,获取由可信的证书授权机构 (CA) 签发的适当 TLS 证书。
  2. 如果无法做到这一点,请执行以下操作,以允许在 Edge Microgateway 中使用自签名证书。

  3. 设置系统属性,以允许 Edge Microgateway 信任所有证书。
  4. 如果您使用的是 Docker,请参阅 使用不受 Node.js 信任的 CA
  5. 否则,请导出名为 NODE_EXTRA_CA_CERTS 的环境变量,指向根 CA 文件。官方 Node.js 网站上对此进行了说明。

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下诊断信息,然后联系 Apigee Edge 支持团队

  • 日志文件:默认文件夹为 /var/tmp,但可以在主 config.yaml 文件 (logging > dir parameter) 中替换该文件夹。建议在向 Apigee Edge 支持团队提供日志文件之前,将 log > level 更改为 info
  • 配置文件:Edge Microgateway 的主要配置位于默认 Edge Microgateway 文件夹 $HOME/.edgemicro 中的 YAML 文件中。有一个名为 default.yaml 的默认配置文件,然后每个环境都有一个配置文件,例如 ORG-ENV-config.yaml。请针对受影响的组织和环境上传此文件的完整版本。

    参考文档

    配置 Edge 界面以使用 TLS 访问 Edge API