400 请求错误 - 向 HTTP 端口发送的普通 HTTP 请求

您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
info

问题

客户端应用收到 HTTP 400 Bad Request 响应,并显示消息 The plain HTTP request was sent to HTTPS port.

出错提示

客户端应用获取以下响应代码:

HTTP/1.1 400 Bad Request

后跟以下 HTML 错误页面:

<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
</body>
</html>

可能的原因

原因 说明 适用的问题排查说明
向已配置 TLS 的虚拟主机发出 HTTP 请求 客户端向已配置 TLS 的虚拟主机发出 HTTP 请求 Edge Public 和 Private Cloud 用户
向已配置 TLS 的目标端点发出 HTTP 请求 向目标端点中已启用 TLS 的后端服务器发出 HTTP 请求。 Edge Public 和 Private Cloud 用户
目标服务器配置不正确 目标服务器配置了安全端口 443,但未启用 SSL。 Edge Public 和 Private Cloud 用户

原因:向已配置 TLS 的虚拟主机发出 HTTP 请求

当客户端尝试连接到 Apigee 上的 API,并且提及的 虚拟主机配置为使用 SSL 并收到 HTTP 请求时,就会发生此错误。

诊断

由于此问题发生在 北向端点上,并且 API 请求在 客户端应用与路由器之间的入口点交互处失败,因此这些错误消息不会记录在 NGINX 路由器 访问日志中。因此,这些请求不会在 API 监控和 跟踪工具等工具中捕获。

  1. 验证您的 API 请求,看看您是否为配置为仅接受安全端口 443 上的请求的主机别名发出 HTTP 请求。如果是,则 会导致此问题。

    不正确的 API 请求示例

    curl http://org-test.apigee.net:443/400-demo
    
    <html>
    <head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
    <body>
    <center><h1>400 Bad Request</h1></center>
    <center>The plain HTTP request was sent to HTTPS port</center>
    <hr><center>server</center>
    </body>
    </html>
  2. 在上面的示例请求中,请注意,系统会向安全端口 443 上的主机别名 myorg-test.apigee.net 发出 HTTP 请求。这会导致 400 Bad Request 错误。

分辨率

您需要验证客户端是否使用的是 HTTP 而不是 HTTPs,并发出正确的请求,如 下所示:

API 请求示例

curl https://org-test.apigee.net:443/400-demo

curl https://org-test.apigee.net/400-demo
< HTTP/1.1 200 OK
< Date: Thu, 25 Feb 2021 13:01:43 GMT
< Content-Type: text/xml;charset=UTF-8
< Content-Length: 403
< Connection: keep-alive
< Server: gunicorn/19.9.0
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true

原因:向已配置 TLS 的目标端点发出 HTTP 请求

如果您错误地将 HTTP 请求配置为 API 代理的目标端点中已启用 TLS 的后端 服务器,则会发生此错误。

诊断

请按照以下步骤使用跟踪工具诊断错误:

  1. 在 Apigee 界面中为受影响的 API 代理启用 Trace
  2. 向 API 代理发出请求。
  3. 选择一个失败的 API 请求,该请求的响应代码为 400
  4. 浏览各个阶段,确定失败发生的位置。
  5. 通常,您会看到来自后端服务器的 400 错误响应。 也就是说,您会在收到的响应 从目标服务器 阶段看到 400 错误响应,如下所示:

  6. 点击跟踪记录中的 AX (记录的分析数据)图标,确定发出请求的目标端点。

  7. 记下 target.url,其中包含协议、后端服务器主机别名, 有时还包含端口号。用于目标网址的 端口为 443,但协议为 HTTP。
  8. 查看目标端点的定义,了解配置。
  9. 验证后端服务器主机是否安全,并且是否监听安全端口(例如 443)。 如果您在 <URL> 元素中使用 http 作为协议,则会导致此问题。

    目标端点配置示例

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <TargetEndpoint name="default">
        <Description/>
        <FaultRules/>
        <PreFlow name="PreFlow">
            <Request/>
            <Response/>
        </PreFlow>
        <PostFlow name="PostFlow">
            <Request/>
            <Response/>
        </PostFlow>
        <Flows/>
        <HTTPTargetConnection>
            <Properties/>
            <URL>http://somehost.org:443/get</URL>
        </HTTPTargetConnection>
    </TargetEndpoint>

    上面的示例显示您使用的是 HTTP 协议,但使用的端口是安全 端口 443。这会导致后端服务器响应 400 Bad Request 和错误消息 The plain HTTP request was sent to HTTPS port.

分辨率

  1. 如果您的后端服务器是安全的/已启用 TLS,请确保在目标端点的<URL>元素中使用协议作为 https,如以下示例所示:

    目标端点配置示例

    <HTTPTargetConnection>
        <Properties/>
        <URL>https://somehost.org:443/get</URL>
    </HTTPTargetConnection>
  2. 如果您的后端服务器不安全,请执行以下操作:

    • 请勿提及安全端口号,例如 443
    • 如果您的后端服务器监听 标准的不安全端口,则完全不必提及端口号
    • 如果您使用的是任何其他不安全端口,请提及端口号,例如: 9080

    目标端点配置示例

    <HTTPTargetConnection>
        <Properties/>
        <URL>http://somehost.org/get</URL>
    </HTTPTargetConnection>
    
    or
    
    <HTTPTargetConnection>
        <Properties/>
        <URL>http://somehost.org:9080/get</URL>
    </HTTPTargetConnection>

原因:目标服务器配置不正确

如果目标服务器配置了安全端口(例如 443),但未启用 SSL,则会导致 Apigee Edge 的消息处理器向安全或 已配置 TLS 的目标服务器发送 HTTP 请求,从而导致此问题。

诊断

请按照以下步骤使用跟踪工具诊断错误:

  1. 在 Apigee 界面中为受影响的 API 代理启用 Trace
  2. 向 API 代理发出请求。
  3. 选择一个失败的 API 请求,该请求的响应代码为 400
  4. 浏览各个阶段,确定失败发生的位置。
  5. 通常,您会看到来自后端服务器的 400 错误响应。 也就是说,您会在从目标服务器收到的响应 阶段看到 400 错误响应,如下所示:

  6. 点击跟踪记录中的 AX (记录的分析数据)图标,确定发出请求的目标端点。

  7. 记下 target.name,它表示目标端点名称。

    在上面的示例跟踪文件中,target.namedefault 。这表示 用于此请求的目标端点是默认端点。

  8. 查看目标端点的定义,了解配置。

    目标端点配置示例

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <TargetEndpoint name="default">
        <Description/>
        <FaultRules/>
        <PreFlow name="PreFlow">
            <Request/>
            <Response/>
        </PreFlow>
        <PostFlow name="PostFlow">
            <Request/>
            <Response/>
        </PostFlow>
        <Flows/>
        <HTTPTargetConnection>
            <Properties/>
            <LoadBalancer>
            <Server name="faulty-target"/>
            </LoadBalancer>
        </HTTPTargetConnection>
    </TargetEndpoint>

    上面的示例目标端点配置显示您使用的是目标服务器 名为 faulty-target.

  9. 获得目标服务器名称后,您可以使用以下方法之一来 检查目标服务器配置:

    • Edge 界面
    • Management API

Edge 界面

  1. 前往 Apigee Edge > 管理 > 环境 > 目标服务器
  2. 选择从 API 代理中标识的特定目标服务器,然后点击 修改
  3. 验证为目标服务器指定的端口和 SSL 信息。
  4. 如果目标服务器配置了安全端口(例如 443), 但未启用 SSL,则会导致此问题。

    如上图所示,使用的端口为 443,但在目标服务器配置中未为该端口启用 SSL。这会导致 Apigee Edge 的消息 处理器向安全端口 443 发送 HTTP 请求。因此,您会收到 错误 400 Bad Request,并显示消息 The plain HTTP request was sent to HTTPS port.

Management API

  1. 执行 Get target server API 以获取有关特定目标服务器配置的详细信息 ,如下所示:

    Public Cloud 用户

    curl -v 'https://api.enterprise.apigee.com/v1/organizations/ORG_NAME/environments/ENV_NAME>/targetservers/TARGET_SERVER_NAME' \
    -H "Content-Type:application/xml" \
    -H "Authorization:Bearer $TOKEN"
    

    Private Cloud 用户

    curl -v 'http://MANAGEMENT_IP:8080/v1/organizations/ORG_NAME/environments/ENV_NAME/targetservers/TARGET_SERVER_NAME' \
    -H "Content-Type:application/xml" \
    -H "Authorization:Bearer $TOKEN"
    
  2. 验证为目标服务器指定的端口和 SSL 信息。
  3. 如果目标服务器配置了安全端口(例如 443),但 未定义或启用 SSLInfo 部分,则会导致此问题。

    目标服务器配置示例

    {
      "host" : "somehost.org",
      "isEnabled" : true,
      "name" : "faulty-target",
      "port" : 443
    }

    在上面的示例输出中,我们可以看到用于目标连接的端口为 443,但没有 SSLInfo 配置块。

    这会导致 Apigee Edge 的消息处理器向安全端口 443 发送 HTTP 请求。因此,您会收到错误 400 Bad Request,并显示消息 The plain HTTP request was sent to HTTPS port.

分辨率

如果您的目标服务器是安全的或已配置 TLS,则需要为特定 目标服务器启用 SSL。

您可以使用以下选项之一来执行此操作:

  • Edge 界面
  • Management API

Edge 界面

  1. 前往 Edge 界面 > 管理 > 环境 > 目标服务器 上的目标服务器。
  2. 选择特定目标服务器,然后点击 修改
  3. 如果您的目标服务器是安全的并且使用端口(例如 443),请选中 SSL 选项旁边的复选框以启用 SSL。
  4. 配置 TruststoreCiphersProtocols。(仅在需要时)

Management API

使用 Management API 配置目标服务器,如 更新目标服务器配置文档中所述。

必须收集的诊断信息

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

  1. 如果您是 Public Cloud 用户,请提供以下信息:
    • 组织名称
    • 环境名称
    • API 代理名称
    • 用于重现错误的完整 curl 命令
    • 跟踪工具输出(如果您能够捕获失败请求的输出)
  2. 如果您是 Private Cloud 用户,请提供以下信息:
    • 观察到的完整错误消息
    • 环境名称
    • API 代理软件包
    • 目标服务器定义(如果您在端点中使用目标服务器)
    • 跟踪工具输出(如果您能够捕获失败请求的输出)