OpenSSL

在-{zh-tw:电脑网路;zh-cn:计算机网络}-上，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赞助。

**主要版本发布**

**算法**
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讯息 date=20241211002803 ，导致 OpenSSL 解析的内容超出讯息末端。CVE 专案分配了识别码CVE  -2011-0014 date=20250205065118  ，这影响了所有 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 date=20250206160944 。

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

**心脏出血漏洞**
OpenSSL 1.0.1至1.0.1f 版本在其 TLS心跳扩展（Heartbeat Extension）的实现中存在一个严重的内存处理漏洞，该漏洞可被利用在每次心跳中泄露最多 64 KB 的应用程序内存。（CVE  -2014-0160 date=20250208114210 ）。通过读取 Web 伺服器的内存，攻击者可能访问敏感数据，包括伺服器的私钥。
这可能使攻击者能够解码之前窃听的通信内容，特别是在加密协议未确保完美前向保密（Perfect Forward Secrecy, PFS）的情况下。掌握私钥还可能让攻击者对未来的通信进行中间人攻击（MITM attack）。
该漏洞还可能泄露其他用户敏感请求与响应的未加密部分，包括会话Cookie 和密码，这可能让攻击者冒充其他用户的身份进行服务操作。
该漏洞于 2014 年 4 月 7 日披露时，估计大约 17%（约 50 万台）由受数位凭证认证机构 (CA) 认证的安全 Web 伺服器可能受到了此攻击的影响。并且，Heartbleed 漏洞可能同时影响伺服器和客户端。

**CCS注入漏洞**
CCS 注入漏洞 (CVE - 2014-0224 date=20250208161411 ) 是一个安全绕过漏洞，是由 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 date=20250208003816 ）允许任何人读取证书的内容并准确地修改它，从而利用该漏洞使客户端或伺服器崩溃。如果客户端连接到一个使用 OpenSSL 1.0.2 的伺服器并在重新协商时提供无效的签名算法扩展，将会发生空指标引用。这可能导致针对伺服器的拒绝服务（DoS）攻击。
斯坦福大学的安全研究员 David Ramos 持有一个私有的漏洞利用程序，并将其提交给 OpenSSL 团队，随后该问题被修补。
OpenSSL 将此漏洞分类为高严重性问题，指出版本 1.0.2 受到影响。

**对 Diffie–Hellman 小型子group的 密钥恢复攻击**
此漏洞（CVE- 2016-0701 date=20250208003808 ）在满足某些特定条件时，允许恢复 OpenSSL 伺服器的 Diffie–Hellman 私钥。
该漏洞由 Adobe 系统安全研究员 Antonio Sanso 私下报告，OpenSSL 将此漏洞分类为高严重性问题，并指出仅版本 1.0.2 受到影响。

**分支**

**asslAgglomerated 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语言代码从分支中删除。

**BORINGSSLBoringSSL**
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 库，而这要求终端使用者需要自行从源码重新构建。

**参见**
 加密- OpenSSH- TLS的应用对比- WolfSSL

**注记**

**参考**

**外部连结**
  OpenSSL官方网站-  SSLeay文件库-  OpenSSL License vs GPLdate=20120415103106 -  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 licensesdate=20141205164319 -   OpenSSL Quick Reference Guide date=20220323202720 -   OpenSSL Cookbook - A Short Guide to the Most Frequently Used OpenSSL Features and Commands By Ivan Ristić date=20220224160656