502 Bad Gateway - 自签名证书链

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

客户端应用收到 HTTP 响应代码 502 和消息 Bad Gateway,作为 Edge Microgate 中 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 Microgate 将验证目标服务器的证书,如果该证书不受信任,则会引发运行时错误。 Edge 公有云和私有云用户
Apigee Edge Management Server 使用自签名证书 首次配置 Edge Microgate 时,它将通过 TLS 连接到 Apigee Edge 以进行引导。如果 Edge 提供自签名证书,则会失败。 Edge Private Cloud 用户

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

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

诊断

您可能会在日志 (/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 Microgate 可能已经收到来自目标服务器的自签名证书。如需确认这一点,请执行以下步骤:

  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 Microgate 中的自签名证书。

    方法 1:设置系统属性以允许 Edge Microgate 信任所有证书

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

      如需了解相关信息,请参阅官方 Node.js 网站。

    方法 2:配置 Edge Microgate 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 Microgate 模块 - 配置单向和双向南向 TLS 视频也介绍了配置说明。如需了解详情,请参阅 在 Edge Microgate 服务器上配置 SSL

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

原因:Apigee Edge Management Server 使用自签名证书

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

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

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 Microgate 中使用自签名证书。

  3. 设置系统属性以允许 Edge Microgate 信任所有证书。
  4. 如果您使用的是 docker,请参阅 使用 Node.js 不信任的 CA
  5. 否则,请导出名为 NODE_EXTRA_CA_CERTS 的环境变量,并将其指向根 CA 文件。如需了解相关信息,请参阅 Node.js 官方网站。

必须收集的诊断信息

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

  • 日志文件:默认文件夹为 /var/tmp,但它可能会在主 config.yaml 文件 (logging > dir parameter) 中被替换。建议您先将 log > level 更改为 info,然后再将日志文件提供给 Apigee Edge 支持
  • 配置文件:Edge Microgate 的主要配置位于默认的 Edge Microgate 文件夹 $HOME/.edgemicro 下的 YAML 文件中。系统会先创建一个名为 default.yaml 的默认配置文件,然后针对每个环境 ORG-ENV-config.yaml 分别使用一个配置文件。请完整上传此文件,供受影响的组织和环境使用。

    参考文档

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