跳过导航

4.x 要求

您是否知道此页面是从 Github Wiki 页面 自动生成的?您可以在 此处 自行改进!

Netty

Netty 项目由各种子模块组成。有关每个子模块的特定要求,请参阅其下面的特定部分。

通常,每个子模块的基本功能需要 Java 6+ 才能运行,需要 Java 7+ 才能编译。

此编解码器为 HTTP/2 协议 提供了一个实现,包括 HPACK

传输安全 (TLS)

尽管 HTTP/2 RFC 不要求使用 TLS,但如果使用 TLS,RFC 会强制执行要求 [1][2][3]。通过 TLS 传输的 HTTP/2 要求使用 ALPN 来协商使用 h2 协议。ALPN 是一个相当新的标准,对于尚不支持 ALPN 的系统,Netty(在可能的情况下)支持通过 NPN 进行协议协商。

使用 OpenSSL 进行 TLS

目前,这是使用 Netty 进行 TLS 的推荐方法。

使用 OpenSSL 的好处

  1. 速度:在本地测试中,我们已经看到性能比 JDK 提高了 3 倍。GCM 是 HTTP/2 RFC 要求的唯一密码套件所使用的,其速度比 JDK 快 10-500 倍。
  2. 密码:OpenSSL 有自己的密码,不受 JDK 限制的影响。这允许在 Java 7 上支持 GCM。
  3. ALPN 到 NPN 回退:OpenSSL 可以同时支持 ALPN 和 NPN。Netty 的 JDK 实现仅在任何给定时间支持 ALPN 或 NPN,并且 NPN 仅在 JDK 7 中受支持
  4. 与 Java 版本无关:不需要根据 JDK 更新使用不同的库版本。这是 Netty 使用的 JDK ALPN 和 NPN 实现的一个限制。

使用 OpenSSL 的要求

  1. OpenSSL 版本 >= 1.0.2(支持 ALPN)或版本 >= 1.0.1(支持 NPN)。
  2. netty-tcnative 版本 >= 1.1.33.Fork7 必须在类路径中。
  3. 支持的平台(对于 netty-tcnative):linux-x86_64mac-x86_64windows-x86_64。支持其他平台需要手动构建 netty-tcnative。

如果满足上述要求,Netty 将自动选择 OpenSSL 作为默认 TLS 提供程序。

配置 netty-tcnative

请参阅 netty-tcnative wiki

使用 JDK 进行 TLS(Jetty ALPN/NPN)

如果您无法使用 OpenSSL,那么替代方法是使用 JDK 进行 TLS。

Java 仅从版本 8u251 和 9 开始支持 ALPN 或 NPN。由于在较旧的 JDK 中缺乏支持,我们需要使用 Jetty-ALPN(或在 Java < 8 上使用 Jetty-NPN)OpenJDK 的启动类路径扩展。为此,添加一个引用 Jetty alpn-boot jar 路径的 Xbootclasspath JVM 选项。

java -Xbootclasspath/p:/path/to/jetty/alpn/extension.jar ...

请注意,您必须使用 与您正在使用的 Java 版本相对应的 Jetty-ALPN jar 版本

JDK 密码

Java 7 不支持 HTTP2 RFC 推荐的密码套件。为了解决此问题,我们建议服务器尽可能使用 Java 8,或使用替代的 JCE 实现,例如 Bouncy Castle。如果这不可行,可以使用其他密码,但您需要确保您打算调用的服务也支持 HTTP/2 RFC 禁止的这些密码,并且已经评估了这样做的安全风险。

用户应注意,在 Java 8u60 之前,GCM 非常慢(1 MB/s)。使用 Java 8u60,GCM 快 10 倍(10-20 MB/s),但与 OpenSSL(~200 MB/s)相比仍然很慢,尤其是在支持 AES-NI(~1 GB/s)的情况下。GCM 密码套件是唯一符合 HTTP2 密码要求的可用套件。

启用 ALPN 或 NPN

SslContextBuilder 有一个 ApplicationProtocolConfig 的设置器,用于配置 ALPN 或 NPN。请参阅 HTTP/2 示例(用于 ALPN)和 SPDY 示例(用于 NPN)。

上次于 2024 年 7 月 19 日检索