开发人员通常希望使用已发布、官方且受支持的库来构建应用和基础设施。即使采用HTTP/3,也迫切需要一个易于使用、支持QUIC,同时不会增加生产基础设施维护成本或运维复杂性的库。
对于许多QUIC+HTTP/3用户而言,默认的加密库是OpenSSL。大多数基于Linux的操作系统都默认安装OpenSSL。它是广泛使用的传输层安全(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的库:目前,BoringSSL、quicTLS和LibreSSL等多种SSL库(均源自OpenSSL的分支)通过实现BoringSSL QUIC API提供QUIC TLS功能。不过,这些库的采用范围不如OpenSSL广泛。此方案还需要从源代码构建SSL库,并将其安装到每台需要支持QUIC+HTTP/3的服务器上,因此可能并不适合所有用户。尽管如此,由于OpenSSL QUIC TLS实现尚未就绪,这仍是目前希望使用HTTP/3的用户唯一可选的方案。
新解决方案:OpenSSL兼容层
这些挑战启发了NGINX创建OpenSSL Compatibility Layer,旨在简化使用OpenSSL的QUIC+HTTP/3部署,并帮助避免在生产环境中维护独立SSL库所带来的复杂性。
OpenSSL兼容层自NGINX Open Source主线版本1.25.0和NGINX Plus R30起提供,使NGINX无需修补或重新构建OpenSSL,即可在其上运行QUIC+HTTP/3。这样便无需通过编译和部署第三方TLS库来获得QUIC支持。由于不需要使用第三方库,也减少了对这些库的发布计划和路线图的依赖,因此在生产环境中部署相对更容易。
OpenSSL兼容层的工作原理
OpenSSL兼容层执行以下步骤:
- 将QUIC握手转换为OpenSSL支持的TLS 1.3握手。
- 将TLS握手消息传入和传出OpenSSL。
- 从OpenSSL获取握手和应用加密级别的加密密钥。
- 在OpenSSL中传入和传出QUIC传输参数。
鉴于OpenSSL目前的广泛应用,以及其对QUIC+HTTP/3的官方支持现状,我们认为,提供一种简单且可扩展的QUIC启用方式是正确方向上的一步。这也将推动HTTP/3的采用,并有助于收集有价值的反馈。更重要的是,我们相信OpenSSL兼容层将帮助我们为企业用户和整个NGINX社区提供更稳健、更具可扩展性的解决方案。
注意:OpenSSL Compatibility Layer为NGINX用户提供了简单且可扩展的选择,但用户仍可选择将BoringSSL、quicTLS或LibreSSL等第三方库与NGINX搭配使用。要确定哪种方案更适合您,请考虑哪种方法最符合您的要求,以及您对自行编译和管理依赖库的熟悉程度。
关于0-RTT的说明
0-RTT是QUIC的一项功能,允许客户端在TLS握手完成前发送应用数据。0-RTT功能通过复用上一次连接中协商的参数来实现。客户端需要记住关键参数,并向服务器提供TLS会话票证,以便服务器恢复相同的信息。
虽然此功能是QUIC的重要组成部分,但OpenSSL Compatibility Layer目前尚不支持该功能。如果您有需要0-RTT的特定用例,欢迎提供反馈,帮助我们规划产品路线图。
深入了解采用QUIC+HTTP/3和OpenSSL的NGINX
现在即可通过NGINX Open Source开始使用NGINX的OpenSSL兼容层,也可以开始NGINX Plus 30天免费试用。希望这项功能对您有所帮助,也欢迎提供反馈。
以下资源提供了有关NGINX与QUIC+HTTP/3和OpenSSL配合使用的更多信息。
- NGINX 中的 QUIC 网络与加密入门
- 预览版NGINX QUIC+HTTP/3实现现已提供二进制软件包
- NGINX 支持 QUIC 和 HTTP/3 的路线图
- 支持开源,共建更安全的世界:F5 NGINX宣布赞助Let’s Encrypt和OpenSSL
相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
