博客 | NGINX

NGINX 对 OpenSSL 的 QUIC+HTTP/3 支持

NGINX-F5-horiz-black-type-RGB 的一部分
Prabhat Dixit 缩略图
帕拉巴特·迪克西特
2023 年 9 月 13 日发布

开发人员通常希望使用已发布的、官方的和受支持的库来构建应用和基础设施。 即使使用 HTTP/3,也迫切需要一个支持 QUIC 的便捷库,并且不会增加生产基础设施的维护成本或操作复杂性。

对于许多QUIC+HTTP/3用户来说,默认的加密库是OpenSSL 。 OpenSSL 默认安装在大多数基于 Linux 的操作系统上,是第一大传输层安全性 (TLS) 库,被大多数网络应用使用。

问题: OpenSSL 与 QUIC+HTTP/3 之间不兼容

即使用途如此广泛,OpenSSL 也没有提供支持 QUIC 所需的 TLS API。 相反,OpenSSL 管理委员会决定自行实现完整的 QUIC 堆栈。 这项工作是为 OpenSSL v3.4 计划的一项重大努力,但根据OpenSSL 路线图,这可能不会在 2024 年底之前实现。 此外,OpenSSL 实现的初始最小可行产品将不包含 QUIC API 实现,因此用户没有明确的途径通过 OpenSSL 获得 HTTP/3 支持。

QUIC TLS 支持选项

在这种情况下,对于寻求 QUIC TLS 支持以满足其 HTTP/3 需求的用户来说,有两种选择:

  • OpenSSL QUIC 实现– 如上所述,OpenSSL 目前正致力于自行实现完整的 QUIC 堆栈。 此次开发将封装实现中的所有 QUIC 功能,使得 HTTP/3 用户可以更轻松地使用 OpenSSL TLS API,而不必担心 QUIC 特定的功能。
  • 支持 BoringSSL QUIC API 的库– 各种 SSL 库(如BoringSSLquicTLSLibreSSL )(它们都是从 OpenSSL 分支开始的)现在通过实现 BoringSSL QUIC API 来提供 QUIC TLS 功能。但是,这些库的采用范围不如 OpenSSL 广泛。 此选项还需要从源代码构建 SSL 库并将其安装在每个需要 QUIC+HTTP/3 支持的服务器上,这对每个人来说可能都不是一个可行的选择。 也就是说,对于想要使用 HTTP/3 的用户来说,这目前是唯一的选择,因为 OpenSSL QUIC TLS 实现尚未准备好。

新的解决方案: OpenSSL 兼容层

在 NGINX,我们受到这些挑战的启发,并创建了 OpenSSL 兼容层,以简化使用 OpenSSL 的 QUIC+HTTP/3 部署,并帮助避免在生产环境中维护单独的 SSL 库所带来的复杂性。

OpenSSL 兼容层自 1.25.0 版起随 NGINX 开源主线NGINX Plus R30提供,它允许 NGINX 在 OpenSSL 上运行 QUIC+HTTP/3,而无需修补或重建它。 这消除了编译和部署第三方 TLS 库以获得 QUIC 支持的依赖。 由于用户不需要使用第三方库,它也减轻了对这些库的计划和路线图的依赖,使其成为在生产中部署相对容易的解决方案。

OpenSSL 兼容层的工作原理

OpenSSL 兼容层实现了以下步骤:

  • 将 QUIC 握手转换为 OpenSSL 支持的 TLS 1.3 握手。
  • 将 TLS 握手消息传递进和传出 OpenSSL。
  • 从 OpenSSL 中获取握手和应用加密级别的加密密钥。
  • 将 QUIC 传输参数传递进和传出 OpenSSL。

根据目前 OpenSSL 的采用量以及对其对官方 QUIC+HTTP/3 支持的状态,我们相信启用 QUIC 的简单且可扩展的选项是朝着正确方向迈出的一步。 它还将促进 HTTP/3 的采用并允许提供宝贵的反馈。 最重要的是,我们相信 OpenSSL 兼容层将帮助我们为企业用户和整个 NGINX 社区提供更为强大、可扩展的解决方案。

笔记: 虽然我们确保 NGINX 用户能够通过 OpenSSL 兼容层轻松且可扩展地使用,但用户仍然可以选择将 BoringSSL、quicTLS 或 LibreSSL 等第三方库与 NGINX 结合使用。要确定哪一种方式适合您,请考虑哪种方法最能满足您的要求,以及您对编译和管理作为依赖项的库的适应程度。

关于 0-RTT 的注释

0-RTT 是 QUIC 中的一项功能,允许客户端在 TLS 握手完成之前发送应用数据。 通过重复使用以前连接中协商的参数,可以实现 0-RTT 功能。 它通过客户端记住关键参数并向服务器提供 TLS 会话票证来启用,从而允许服务器恢复相同的信息。

虽然此功能是 QUIC 的重要组成部分,但它尚不受 OpenSSL 兼容层支持。 如果您有需要 0-RTT 的特定用例,我们欢迎您的反馈以告知我们的路线图。

了解有关使用 QUIC+HTTP/3 和 OpenSSL 的 NGINX 的更多信息

您现在就可以开始通过NGINX 开源使用 NGINX 的 OpenSSL 兼容层,或者开始30 天免费试用 NGINX Plus 。 我们希望您发现它有用并欢迎您的反馈。

有关使用 QUIC+HTTP/3 和 OpenSSL 的 NGINX 的更多信息,请参阅以下资源。


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”