curl 之父发文介绍 OpenSSL 分支家族


curl 之父近日发表文章介绍 OpenSSL 分支家族,展示了它们的差异、相似之处,以及支持它们所需的一些见解。

译文如下:


curl 支持使用 11 种不同的 TLS 库进行编译。其中六个库是 OpenSSL 或其分支。让我向你展示它们的差异、相似之处,以及支持它们所需的一些见解。

SSLeay

这一切都始于 SSLeay。这是我发现的第一个 SSL 库,我们使用这个库在 1998 年春天为 curl 添加了第一个 HTTPS 支持。显然,SSLeay 项目早在 1995 年就已经启动了。

那是一个我们还只支持 SSL 的年代;TLS 会在之后才出现。

OpenSSL 一直拥有一个古怪、不一致且极其庞大的 API 集(其中一大部分是从 SSLeay 继承而来的),这进一步被稀疏的文档所复杂化,这些文档留给用户去依靠自己的想象力和技能去查阅源代码,以获取最后的细节解答(即使在 2025 年今天也是如此)。在 curl 中,我们经常收到关于如何使用这个库的偶尔问题报告,即使已经过了几十年。 presumably,这同样适用于所有 OpenSSL 用户。

OpenSSL 项目经常受到批评,认为他们在几年前升级到版本 3 之后,在性能方面有所疏忽。他们也一直进展缓慢或不愿采用新的 TLS 技术,例如 QUIC 和 ECH。

尽管如此,OpenSSL 已经成为一种主导的 TLS 库,尤其是在开源领域。

LibreSSL

回到Heartbleed事件时期,LibreSSL分叉出来并成为独立的项目。他们删除了他们认为不属于库中的功能,创建了自己的TLS库API。几年后,苹果在macOS上使用LibreSSL提供curl。他们有一些本地修补,使它行为与其他不同。

LibreSSL在QUIC的支持上落后,不支持SSLKEYLOGFILE、ECH,而且如今在实现新功能方面似乎比OpenSSL更慢。

curl自从创建以来就与LibreSSL完美配合。

BoringSSL

在Heartbleed事件时期由Google分叉出来。Google为Google做的,他们没有公开发布过,清理了很多原型和变量类型,并在QUIC API推动中处于领先地位。总体而言,大多数新的TLS发明都已在BoringSSL中实现和支持,比其他分叉更早。

Google在Android的其他地方也使用这个。

curl 从创建以来就与 BoringSSL 完美配合。

AmiSSL

一个为使 OpenSSL 能够在 AmigaOS 上正确编译和运行而制作的 OpenSSL 分支或变种。我对它了解不多,但在这里包含它是为了完整性。它似乎基本上是为 Amiga 系统移植的 OpenSSL。

当为 AmigaOS 编译时,curl 也能与 AmiSSL 兼容。

QuicTLS

由于 OpenSSL 延迟响应并拒绝提供 QUIC API,其他分支在 2020 年初期(我尚未看到有人解释原因)采取了行动。微软和 Akamai 分支了 OpenSSL,产生了 QuicTLS,此后它试图成为一个 轻量级 的分支,主要只是在与 BoringSSL 和 LibreSSL 支持相同风格的基础上添加 QUIC API。轻量级 的含义是它们密切跟踪上游开发,并且除了 QUIC API 之外,没有打算在其他方面偏离。

在 OpenSSL 3.5 中,他们终于提供了一个与 fork(包括 QuicTLS)提供的 QUIC API 不同的 QUIC API。我认为这促使 QuicTLS 重新考虑其未来的发展方向,但我们仍在等待确切的进展。

curl 自从创建以来就与 QuicTLS 完美配合。

AWS-LC

这是由亚马逊维护的一个 BoringSSL 分支。与 BoringSSL 不同的是,他们确实进行了实际的(频繁的)发布,因此看起来像一个项目,即使是非亚马逊用户也可以实际使用和依赖——尽管他们存在的目的是 _维护一个与 AWS 使用的软件和应用程序兼容的安全 libcrypto _。令人惊讶的是,他们维护的不仅仅是“仅仅” libcrypto。

这个分支最近显示出大量的活动,甚至在核心部分也是如此。2025 年 5 月由 HAProxy 团队进行的基准测试 表明,AWS-LC 显著优于 OpenSSL。

AWS-LC 提供的 API 与 BoringSSL 的 API 并不完全相同。

curl 与 AWS-LC 从 2023 年初开始就配合得非常好。

家族树

OpenSSL 分支家族树

OpenSSL 分支家族现状

这六个不同的分支各自有其特定的特性、API 和功能,这些在不同版本中也会发生变化。目前我们仍然支持这六个分支,因为人们似乎仍在使用它们,而且维护起来是可行的。

我们使用相同的 单个源代码文件 支持所有这些分支,并通过不断增长的 #ifdef 逻辑来实现。我们通过在 CI 中使用这些分支进行构建验证,尽管只使用了一小部分最近的版本。

随着时间的推移,这些分支似乎正在逐渐彼此分离。我认为这还不构成一个问题,但我们当然在监控这种情况,可能在某个时候需要进行一些内部重构以适应这种变化。

未来

我无法预见会发生什么。如果历史是一堂课,我们似乎更倾向于走向更多的分支,而不是更少的分支。但当然,每一位阅读这篇博客文章的读者现在都会思考,所有这些分支所耗费的重复努力以及由此带来的隐含低效性到底有多少。这不仅适用于这些库本身,也适用于像curl这样的用户。

我认为我们只能等待观察。


相關推薦

2022-09-06

Node.js 之父 RD 近日发文呼吁 Oracle 释放 "JavaScript" 商标。 据介绍,1995 年,Netscape 与 Sun Microsystems 合作创建了可互动的网站。工程师 Brendan Eich 花费 10 天时间就创建了第一个版本的 JavaScript,这是一门动态编程语言,其语法

2022-10-29

Fedora 项目经理 BEN COTTON 在博客中的介绍:因严重的 OpenSSL 漏洞,原定于 10 月中旬发布的 Fedora 37 将延迟至 11 月中旬发布。 10 月 25 日,OpenSSL 团队在邮件和推特中宣布 OpenSSL 3.x 版本出现了一个非常严重的安全漏洞,将

2022-11-20

将声明和代码混合 long long类型和库函数 snprintf()函数家族 枚举声明中支持尾随逗号 可变参数宏 长度可变的数组 当然,开发者还可以使用许多其他的特性,但问题是他们是否真的需要这些特性。而且对于上面提到的

2025-04-04

DE 和 CURLFOLLOW_FIRSTONLY gnutls:通过 –ciphers 设置优先级 OpenSSL/quictls:支持 TLSv1.3 early data wolfSSL:支持 TLSv1.3 early data rustls:添加对 CERTINFO 的支持 rustls:添加对 SSLKEYLOGFILE 的支持 rustls:支持 ECH 和 DoH 查找配置 rustls:支

2023-01-18

“JSON”或“TREE”。默认值为“TRADITIONAL”。 对于绑定OpenSSL 库的操作系统,链接OpenSSL库用于MySQL Server版本已更新至1.1.1s。 二进制包中包含curl已升级为使用curl7.86.0(非链接到系统的curl库的情况)。 强化内部资源组

2022-12-22

地方,我们现在尽可能地限制他们只接受十进制数字。 openssl:用'[lib]/[version]:'作为错误的前缀 RTSP 认证再次工作,这个功能在几个版本前被破坏了,现在它终于被再次修复。 修复代理的 IDN cmake:在共享库上设置 soname We

2024-02-17

关闭但 JIT_debug 仍然打开时会报告 Segmentation fault)。 OpenSSL: 修复了未设置 OPENSSL_NO_ENGINE 时 LibreSSL 未定义的引用。 PDO_Firebird: 修复GH-13119(更改为使用 `H` 格式将 float 和 double 值转换为字符串)。 Phar: 修

2023-01-17

现了 Java 最初版本的编译器和虚拟机,也是公认的 “Java 之父”。 Gosling 现在是 AWS 的工程师,在 12 月初的 reClojure 2022 线上会议中发表了主题演讲。他分享了在技术行业工作数十年的经验,这些经验最终使他进入了云服

2022-03-27

Go 官方博客近日发表了一篇介绍新特性“泛型”的文章,作者是两位重量级人物 —— Robert Griesemer 和 Ian Lance Taylor,内容基于他们在 2021 年 GopherCon 大会上的演讲。 ▲ 左:Go 语言设计者之一 Robert Griesemer;右:Go 泛型主要设

2022-11-19

Racket v8.7 已发布,Racket(原名 PLT Scheme)是一门通用、多范型,属于 Lisp 家族的函数式程序设计语言,它的设计目之一是为了提供一种用于创造设计与实现其它编程语言的平台,Racket 被用于脚本程序设计、通用程序设计、计算机

2023-02-10

Racket v8.8 已发布,Racket(原名 PLT Scheme)是一门通用、多范型,属于 Lisp 家族的函数式程序设计语言,它的设计目之一是为了提供一种用于创造设计与实现其它编程语言的平台,Racket 被用于脚本程序设计、通用程序设计、计算机

2025-05-17

改进模型。SWE-1 目前对 Pro 用户限时免费。 据 Windsurf 介绍,SWE-1 是其中最大、能力最强的 AI 模型,旨在突破现有大模型在软件工程实际需求上的局限。 相比只关注代码生成和单元测试的传统模型,SWE-1 更强调对开发流程中

2022-10-12

cks进行控制是否忽略对某些线程执行的语句进行改写。 OpenSSL:在内置OpenSSL的平台上,MySQL使用的OpenSSL库升级至1.1.1q。 监视缓冲池调整容量:InnoDB提供了两个新的状态变量Innodb_buffer_pool_resize_status_code和Innodb_buffer_pool_resize_stat

2022-08-18

Racket v8.6 已发布,Racket(原名 PLT Scheme)是一门通用、多范型,属于 Lisp 家族的函数式程序设计语言,它的设计目之一是为了提供一种用于创造设计与实现其它编程语言的平台,Racket 被用于脚本程序设计、通用程序设计、计算机