Apigee Edge 4.54.00 中的 Nginx 1.30 变更

Nginx 变更概览

适用于私有云的 Apigee Edge 4.54.00 在 Edge 路由器上强制升级到 Nginx 版本 1.30。

Nginx 1.26 发布后,引入了一些重要变更,以增强安全性并确保符合 HTTP 标准。以下是主要更新:

处理标头名称和值中的空格

为了提高安全性,我们加强了对 RFC 7230 的遵守,尤其是在处理标头中的空格方面。如需详细了解这些变更,请参阅附录。

处理 Content-Length 和 Transfer-Encoding 标头

请求走私攻击中使用的常见技术之一是发送同时包含 Content-Length 和 Transfer-Encoding 标头的 HTTP 请求。虽然 Apigee Edge 已经针对此类攻击进行了强化,但 Nginx 现在会明确阻止包含这两个标头的请求。如果发送此类请求,Nginx 将返回 400 Bad Request 错误。

支持的加密方式

此版本可能会更改出站请求支持的加密方式列表。您可以检查路由器主机上 OpenSSL 支持的加密方式,以获取可用加密方式的更新列表。

支持的密钥大小

以前,系统默认接受小于 2048 位的 RSA、DSA 和 DH 密钥,以及小于 224 位的 ECC 密钥。不过,在此更新之后,对于出站请求,单向和双向 TLS 连接将不再允许使用此类密钥。

附录

标头中的空格

主要有三项变更:

  1. 某些之前允许的标头名称现在被 Nginx 1.26 禁止。包含这些标头的请求会导致 400 Bad Request 错误。
  2. 某些之前允许的标头值现在被 Nginx 1.26 禁止。包含这些标头的请求也会导致 400 Bad Request 错误。
  3. 某些之前被 Nginx 接受但在消息处理器中导致下游失败的标头现在会被 Nginx 直接拒绝。虽然这些标头仍然会导致 API 失败,但 HTTP 失败消息将会发生变化。

以下部分提供了各种被禁止的标头名称和标头值的示例。这些只是示例,可能不是详尽的列表。建议遵循 RFC 7230 中有关标头的准则。

标头名称的变更

本部分列出了 Nginx 1.20.1 中允许但在 Nginx 1.26 中禁止的各种标头名称。

场景 标头名称示例
标头名称开头、结尾或中间的控制字符 { '\u0001'Header0, Value0 }
{ Header6'\u0002', Value6 }
{ Header'\u0005'4, Value4 }
标头名称中的开头和结尾空格 {"Header2 ", "Value2"}
{" Header3", "Value3"}
{" Header4 ", "Value4"}
标头名称中的开头和结尾 HTAB {"\tHeader11", "Value11"}
{"Header12\t", "Value12"}
{"\tHeader13\t", "Value13"}
标头名称中的开头和结尾 HTAB、WS 组合 {"\t Header24", "Value24"}
{" \tHeader25", "Value25"}
{"Header26 \t", "Value26"}
{"Header27\t ", "Value27"}
标头名称中间的换行符 (\n) 后紧跟 WS 或一系列 WS {"Header\n 57Mutiline", "Value57"}
{"Header\n 58Mutiline", "Value58"}
标头名称中间的换行符 (\n) 后紧跟 HTAB 或一系列 HTAB {"Header\n\t73", "Value73"}
{"Header\n\t\t74", "Value74"}
标头名称中间的回车符 (\r) 换行符 (\n) 后紧跟 HTAB 或一系列 HTAB {"Header\r\n\t69", "Value69"}
{"Header\r\n\t\t70", "Value70"}
标头名称中间的回车符 (\r) 换行符 (\n) 后紧跟 WS 或一系列 WS {"Header\r\n 71", "Value71"}
{"Header\r\n 72", "Value72"}

标头值的变更

本部分显示了 Nginx 1.20.1 中允许但在 Nginx 1.26 中禁止的各种标头值。

场景 示例
HEADERVALUE 中允许使用 \r\n 或 \r\n 与 WS 或 HTAB 的组合 {"Header47", "Value47\r\n MultiLine"},
{"Header48", "Value48\r\n MultiLine"},
{"Header49b", "Value49b\r\n \r\nMultiLine"},
{"Header50", "Value50 \r\n MultiLine"},
{"Header51", "Value51\r\n\tMultiLine"},
{"Header52", "Value52\r\n\t\tMultiLine"},
{"Header53", "Value53\t\r\n\tMultiLine"}
HEADERVALUE 中允许使用 \n 或 \n 与 WS 或 HTAB 的组合 {"Header61", "Value\n 61Multiline"},
{"Header62", "Value\n 63Multiline"},
{"Header65", "Value\n\t65"},
{"Header66", "Value\n\t\t66"},
{"Header67", "Value\n 67"},
{"Header68", "Value\n 68"}

HTTP 失败响应的变更

本部分介绍了旧版 Nginx 允许但被上游消息处理器拒绝的标头,这些标头会导致 400 状态代码。不过,在 Nginx 1.26 中,此类标头会导致 Nginx 直接失败,从而阻止请求转发到消息处理器。

对于发送此类标头的客户端,HTTP 状态代码将保持为 400。不过,HTTP 响应正文可能会发生变化,因为失败现在将由 Nginx 而不是消息处理器生成。

场景 示例
HEADERNAME 中间的 HTAB 或 WS

消息处理器会拒绝此类请求。使用 Nginx 1.26 时,这些请求将由 Nginx 本身拒绝。API 使用方将在正文中收到包含 Nginx 出错提示的 400 错误响应。

{"Header 5", "Value5"},
{"Header\t14", "Value14"},
{"Header\t 32", "Value32"},
{"Header \t33", "Value33"},
{"Header- 36", "Value36"},
{"Header-\t40", "Value40"},
{"Header 4a", "Value4a"},
{"Header\t 59", "Value59"},
{"Header\t 60", "Value60"}