OpenSSL

OpenSSL是一个开放源代码的软件函式库套件，应用程序可以使用这个套件来在计算机网络上进行安全通讯，避免窃听，同时确认另一端连线者的身份。这个套件广泛被应用在互联网的网页服务器上。

其主要函式库是以C语言所写成，实作了基本的加密功能，实作了SSL与TLS协定。OpenSSL可以运行在OpenVMS、 Microsoft Windows以及绝大多数类Unix操作系统上（包括Solaris，Linux，Mac OS X与各种版本的开放源代码BSD操作系统）。

虽然此软件是开放源代码的，但其3.0以前版本的授权条款与GPL有冲突之处，故GPL软件使用OpenSSL时（如Wget）必须对OpenSSL给予例外。

## 历史

OpenSSL计划在1998年开始，其目标是发明一套自由的加密工具，在互联网上使用。OpenSSL以Eric Young以及Tim Hudson两人开发的SSLeay为基础，随着两人前往RSA公司任职，SSLeay在1998年12月停止开发。因此在1998年12月，社群另外分支出OpenSSL，继续开发下去。

OpenSSL管理委员会目前由7人组成，有13个开发人员具有提交权限（其中许多人也是OpenSSL管理委员会的一部分）。只有两名全职员工（研究员），其余的是志愿者。

该项目每年的预算不到100万美元，主要依靠捐款。TLS 1.3的开发由Akamai赞助。

## 主要版本发布

版本｜初始版本日期｜备注｜最近更新版本

o｜1998年12月23日｜、OpenSSL项目的正式开启｜0.9.1c（1998年12月23日）

o｜1999年3月22日｜、取代0.9.1c｜0.9.2b（1999年4月6日）

o｜1999年5月25日｜、取代0.9.2b｜0.9.3a（1999年5月27日）

o｜1999年8月9日｜、取代0.9.3a｜0.9.4（1999年4月9日）

o｜2000年2月28日｜、取代0.9.4｜0.9.5a（2000年4月1日）

o｜2000年9月24日｜、取代0.9.5a｜0.9.6m（2004年3月17日）

o｜2002年12月31日｜、取代0.9.6m｜0.9.7m（2007年2月23日）

o｜2005年7月5日｜、取代0.9.7m｜0.9.8zh（2015年12月3日）

o｜2010年3月29日｜、取代0.9.8n｜1.0.0t（2015年12月3日）

o｜2012年3月14日｜、取代1.0.0、维护至2016年12月31日、支持RFC 6520 TLS/DTLS心跳、支持SCTP、RFC 5705 TLS key material exporter、RFC 5764 DTLS-SRTP协商、Next Protocol Negotiation、PSS signatures in certificates, requests and 证书吊销列表、Support for password based recipient info for CMS、支持TLS v1.2以及TLS v1.1、Preliminary FIPS capability for unvalidated 2.0 FIPS module、支持安全远程密码协议（SRP）｜1.0.1u（2016年9月22日）

o｜2015年1月22日｜、取代1.0.1、维护至2019年12月31日（长期维护）、Suite B支持TLS 1.2和DTLS 1.2、支持DTLS 1.2、TLS自动选择椭圆曲线（EC）、用于设置TLS支持的签名算法和曲线的API、SSL_CONF配置API、支持TLS Brainpool、支持应用层协议协商、CMS支持RSA-PSS、RSA-OAEP、ECDH及X9.42 DH｜1.0.2u（2019年12月20日）

o｜2016年8月25日｜、取代1.0.2h、维护到2019年9月、支持BLAKE (RFC 7693)、支持ChaCha20-Poly1305（RFC 7539）、支持X25519（RFC 7748）、支持DANE和证书透明度、支持扩CCM模式密码套件、支持扩展主密钥、移除SSLv2、移除对Kerberos密码包的支持、将RC4和3DES从libssl从DEFAULT密码套件中移除、将DSS、SEED、IDEA、CAMELLIA以及AES-CCM从DEFAULT密码套件中移除、将40和56位密码从libssl中移除｜1.1.0l（2019年9月10日）

o｜2018年9月11日｜、长期支援版本（维护至2023年9月11日）、支持TLS1.3、支持SHA-3、支持X448以及Ed448（RFC 7748）、支持SipHash、支持ARIA (cipher)、支持多素数RSA（RFC 8017）、支持SM2、SM3以及SM4、移除Heartbleed、移除对QNX支持的支持｜1.1.1w

跳过主要版本号2.0.0，因为该版本号先前被用于OpenSSL的FIPS模组中。｜2021年9月7日｜、重新授权至Apache License 2.0、重新支援FIPS 140｜3.0.10

2023年3月14日｜、FIPS 140-3合规、效能改善｜3.1.2

2023年11月23日｜、客户端支援 QUIC、TLS 证书压缩、ECDSA 的确定性使用、TLS 原始公钥支援｜持续开发中

2024年4月9日｜持续开发中

c｜2024年10月22日｜持续开发中

l

## 算法

OpenSSL支持许多不同的加密算法：

加密：AES、Blowfish、Camellia、Chacha20、Poly1305、SEED、CAST-128、DES、IDEA、RC2、RC4、RC5、TDES、GOST 28147-89、SM4

密码杂凑函数：MD5、MD4、MD2、SHA-1、SHA-2、SHA-3、RIPEMD-160、MDC-2、GOST R 34.11-94、BLAKE2、Whirlpool、SM3

公开密钥加密：RSA、DSA、ECDSA、ECDHE、迪菲-赫尔曼密钥交换、椭圆曲线密码学、X25519、Ed25519、X448、Ed448、GOST R 34.10-2001、SM2

（从1.0版开始，椭圆曲线迪菲-赫尔曼金钥交换用于支持前向安全性）)

## 授权条款(Licensing)

OpenSSL 根据 OpenSSL 许可证和 SSLeay 许可证获得双重许可，这意味着可以使用任一许可证的条款。OpenSSL 授权实际上是 Apache授权条款1.0，而 SSLeay 授权则与四条款 BSD授权条款有些相似。

由于OpenSSL 授权是Apache授权条款1.0（而非Apache授权条款2.0），因此被要求在宣传资料和任何redistributions中明确标出：“本产品包含由 OpenSSL Project 开发，用于 OpenSSL 工具包的软件”（根据 OpenSSL 授权第 3 和第 6 条规定）。由于此限制，OpenSSL授权和Apache授权条款1.0这两个授权与GNU GPL授权不相容。

一些 GPL 开发者为了允许他们的系统与 OpenSSL 一起使用，特别在他们的授权条款中加入了"OpenSSL例外"。例如，GNU Wget 和 climm 采用了这样的例外条款。某些套件（如 Deluge）在 GPL 授权条款的开头添加额外部分，记录此例外。而其他套件则选择使用具有不同授权的替代品，例如采用 GNU-LGPL 的 GnuTLS、BSD 授权的 Botan、MPL 授权的 NSS，这些工具具备相同的功能。

2015 年 8 月，OpenSSL 宣布将要求大多数贡献者签署贡献者授权协议（Contributor License Agreement, CLA），并计划将 OpenSSL 的授权最终变更为Apache授权条款 2.0。此过程于 2017 年 3 月展开，并于 2018 年完成。

2021 年 9 月 7 日，采用Apache授权条款 2.0 授权的OpenSSL 3.0.0 正式发布。

## 发生过的重大漏洞

### 拒绝服务(DoS): ASN.1 解析

在OpenSSL 0.9.6k，某些特定的ASN.1序列会在 Windows 电脑上触发大量递回。该错误于 2003 年 11 月 4 日被发现。能够发送任意大量的 ASN.1 序列将导致 OpenSSL 崩溃。

### "可预测私钥"漏洞（仅限Debian）

OpenSSL 的伪乱数产生器使用复杂的程式方法来取得熵。为了防止Valgrind分析工具发出相关警告， Debian发行版的维护者对 Debian 的 OpenSSL 套件变体应用了补丁，该补丁将其可生成的私钥总数限制为32,768，无意中破坏了其随机数生成器。损坏的版本包含在 2006 年 9 月 17 日发布的 Debian 版本中（版本 0.9.8c-1），这也影响了其他基于Debian的系统，例如Ubuntu。

该错误于 2008 年 5 月 13 日由 Debian 报告。在 Debian 4.0 发行版（代号 etch）中，这些问题已在版本 0.9.8c-4etch3 中修复，而针对 Debian 5.0 发行版（代号 lenny）的修复则包含在版本 0.9.8g-9 中。

### OCSP 装订漏洞

在连线建立的握手阶段时，用户端可能会传送格式不正确的 ClientHello讯息，导致 OpenSSL 解析的内容超出讯息末端。CVE 专案分配了识别码CVE -2011-0014，这影响了所有 OpenSSL 版本 0.9.8h 至 0.9.8q 以及 OpenSSL 1.0.0 至 1.0.0c。由于解析可能会导致读取不正确的内存位址，因此攻击者有可能引发DoS。某些应用程序也可能会暴露已解析的OCSP扩充的内容，从而导致攻击者能够读取ClientHello之后的内存内容。

### ASN.1 BIO 漏洞

当使用基本输入/输出 (BIO) 或基于 FILE 的函数读取不受信任的DER格式资料时，OpenSSL 容易受到攻击。但该漏洞不会直接影响 OpenSSL 的 SSL/TLS 程式码，或者任何使用 ASN.1 函数（特别是 d2i_X509 和 d2i_PKCS12）的应用程序。

该漏洞于 2012 年 4 月 19 日发现，并分配了 CVE 识别码CVE - 2012-2110。

### SSL、TLS 和 DTLS 明文恢复攻击

在处理 SSL、TLS 和 DTLS 中的 CBC 密码套件时，发现 OpenSSL 在 MAC 处理期间容易受到定时攻击。Nadhem Alfardan 和 Kenny Paterson 发现了这个问题，并于 2013 年 2 月 5 日发布了他们的发现。CVE 识别码为CVE - 2013-0169

### 心脏出血漏洞

OpenSSL 1.0.1至1.0.1f 版本在其 TLS心跳扩展（Heartbeat Extension）的实现中存在一个严重的内存处理漏洞，该漏洞可被利用在每次心跳中泄露最多 64 KB 的应用程序内存。（CVE -2014-0160）。通过读取 Web 服务器的内存，攻击者可能访问敏感数据，包括服务器的私钥。

这可能使攻击者能够解码之前窃听的通信内容，特别是在加密协议未确保完美前向保密（Perfect Forward Secrecy, PFS）的情况下。掌握私钥还可能让攻击者对未来的通信进行中间人攻击（MITM attack）。

该漏洞还可能泄露其他用户敏感请求与响应的未加密部分，包括会话Cookie 和密码，这可能让攻击者冒充其他用户的身份进行服务操作。

该漏洞于 2014 年 4 月 7 日披露时，估计大约 17%（约 50 万台）由受数位凭证认证机构 (CA) 认证的安全 Web 服务器可能受到了此攻击的影响。并且，Heartbleed 漏洞可能同时影响服务器和客户端。

### CCS注入漏洞

CCS 注入漏洞 (CVE - 2014-0224 ) 是一个安全绕过漏洞，是由 OpenSSL 中处理密钥材料的方法存在的弱点引起。

此漏洞可以通过中间人攻击（MITM）被利用。攻击者可以解密和修改传输中的流量。一名远程未经身份验证的攻击者可以通过特制的握手过程迫使通信双方使用弱密钥材料。成功的攻击可能导致安全绕过，使攻击者能够访问潜在的敏感信息。该攻击仅能在易受攻击的客户端与服务器之间执行。

OpenSSL 用户端在版本 0.9.8za、1.0.0m 和 1.0.1h 之前的所有 OpenSSL 版本中都存在漏洞。仅已知 OpenSSL 1.0.1 和 1.0.2-beta1 中的服务器容易受到攻击。建议使用 1.0.1 之前版本服务器的用户升级作为预防措施。

### ClientHello 为内容的 DoS 攻击

此漏洞（CVE - 2015-0291）允许任何人读取证书的内容并准确地修改它，从而利用该漏洞使客户端或服务器崩溃。如果客户端连接到一个使用 OpenSSL 1.0.2 的服务器并在重新协商时提供无效的签名算法扩展，将会发生空指标引用。这可能导致针对服务器的拒绝服务（DoS）攻击。

斯坦福大学的安全研究员 David Ramos 持有一个私有的漏洞利用程序，并将其提交给 OpenSSL 团队，随后该问题被修补。

OpenSSL 将此漏洞分类为高严重性问题，指出版本 1.0.2 受到影响。

### 对 Diffie–Hellman 小型子group的 密钥恢复攻击

此漏洞（CVE- 2016-0701）在满足某些特定条件时，允许恢复 OpenSSL 服务器的 Diffie–Hellman 私钥。

该漏洞由 Adobe 系统安全研究员 Antonio Sanso 私下报告，OpenSSL 将此漏洞分类为高严重性问题，并指出仅版本 1.0.2 受到影响。

## 分支

### Agglomerated SSL

在2009年，OpenSSL API受挫之后，当时的OpenBSD开发人员Marco Peereboom创建了分支Agglomerated SSL（assl），它重新使用OpenSSL API，但提供了更简单的外部接口。

### LibreSSL

2014年4月的心脏出血漏洞事件之后，OpenBSD项目成员以OpenSSL 1.0.1g作为分支，创建一个名为LibreSSL的项目。在缩减OpenSSL的代码库的第一周，将超过90,000行的C语言代码从分支中删除。

### BoringSSL

2014年6月，Google发布了自己的OpenSSL分支BoringSSL，计划与OpenSSL和LibreSSL的开发者合作。

### GmSSL

GmSSL支持SM2/SM3/SM4/SM9/ZUC等商用密码，主要使用SM2替代RSA/Diffie-Hellman/ECDSA/ECDH，SM3替代MD5/SHA-1/SHA-256，SM4替代DES/AES，SM9替代PKI/CA体系，所有代码在GitHub上开源，并由北京大学信息安全实验室开发和维护。此项目获得2015年度中国Linux软件大赛二等奖（一等奖空缺）。

## 受到的批评

### 旧版本兼容问题

在开发者社群中，经常提及OpenSSL每次推出新的主要版本时引入 API 相容性破坏的案例，此时就会需要对软件进行调整，从而往往延迟新版本的采用。

此外，由于旧版本通常在新主要版本发布后的维护期不超过两年，这种情况往往迫使某些供应商必须非常早地开始准备软件迁移。因此在更新到新版本时，有时可能面临失去与现有软件的某些相容性风险，或导致软件回归(Software regression)的风险。

### 发行版本间隔时间太长

虽然长期支援版本（LTS)会维护长达 5 年，但发行时间间的间隔往往迫使操作系统供应商不得不长时间地停留在最后一个支援的版本上，从而在新版本发布时较没有缓冲时间。

例如，OpenSSL 3.0 原本预计在 2019 年第 4 季发布，但最终拖延了 21 个月才发行，且没有延长对先前支援的版本 1.1.1 的预期支援结束日期，尽管存在需要对现有软件进行适配的重要变更。

### 显著的性能下降

上述提到的 1.1.1 版本较短的支援延迟引发了对对性能敏感的使用者更多的担忧。在 OpenSSL 3.0 正式发布后不久，一些使用者开始报告该版本在多执行绪环境下出现严重的性能下降问题，许多人指出频繁的底层操作中锁的使用效率较低，导致速度降低达到 80 到 400 倍。OpenSSL 团队已建立一个综合性问题来试图集中收集这些大规模性能回归的报告。

大约一半的回报者表示，无法从早期版本升级到 3.0，这进一步加剧了由于先前版本 1.1.1 版本支援时间有限而带来的困扰。

### 对用户需求的考量

在开发 QUIC 传输以支援 HTTP 3.0时，提出使用 TLS 来提供安全性，并发现需要对 TLS 库进行一些适配修改。这些修改最初引入到了 BoringSSL，成为当时 QUIC 开发者主要使用的版本，后来也被移植到其他版本中。这项工作的移植很快被提议给 OpenSSL。

虽然当天就开始讨论，但进展迅速受阻，最初是由于授权考量而受阻，然后在这些问题解决后仍被搁置。最终，10 个月后，OpenSSL 管理委员会在一篇博客文章中宣布，由于担心 API 会随时间变更，这些补丁集将不会被纳入 3.0 版本。

在预计发布 3.0 版本超过一年后，该版本仍遥遥无期，一支来自 Akamai 和 Microsoft 的志愿者团队决定 fork 该项目为 QuicTLS，并在 OpenSSL 代码上支援这些补丁，以促进 QUIC 开发进展。这一行动得到了社群的普遍欢迎。

最终，在 OpenSSL 3.0 正式发布后，QUIC 补丁集再次被考虑，但最终被否决，该 pull 请求被关闭，在社群中引发了数十到数百条失望反应。也有使用者向操作系统供应商请求支援替代的 QuicTLS 分叉，或寻找其他解决方案。

最后，QuicTLS 项目的联合创始人 Rich Salz，宣布希望从 QuicTLS 分叉出一个 Apache 项目。但截止到 2023 年 2 月 25 日，仍然没有一个预设在操作系统中提供长期支援且兼容 QUIC 的 TLS 库，而这要求终端使用者需要自行从源码重新构建。

## 外部链接

- OpenSSL官方网站
- SSLeay文件库
- OpenSSL License vs GPL
- wget's readme file，including the GPL with exception
- mICQ COPYING file，citing the GPL and including the exception
- OpenSSL FAQ entry on interaction between the OpenSSL and GNU licenses
- OpenSSL Quick Reference Guide
- OpenSSL Cookbook - A Short Guide to the Most Frequently Used OpenSSL Features and Commands By Ivan Ristić

## 基本资料

- 开发者：OpenSSL专案
- 发行日期：1998
- 编程语言：C语言、汇编、Perl
- 类型：安全性加密函式库
- 许可协议：3.0以前：OpenSSL与SSLeay双重授权条款、3.0开始：Apache许可证2.0