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 连接将不再允许使用此类密钥。
附录
标头中的空格
主要有三项变更:
- 某些之前允许的标头名称现在被 Nginx 1.26 禁止。包含这些标头的请求会导致 400 Bad Request 错误。
- 某些之前允许的标头值现在被 Nginx 1.26 禁止。包含这些标头的请求也会导致 400 Bad Request 错误。
- 某些之前被 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"} |