在本文档中,OpenSSL管理委员会概述了OpenSSL战略体系结构的基本原理。 从3.0.0开始,从当前体系结构(版本1.1.1)过渡到将来,将需要多个版本。预计体系结构将发生许多变化。 我们提供了一种可能的迁移途径。 OpenSSL 3.0.0的发布对绝大多数现有应用程序的影响最小,几乎所有需要读写的应用程序都需要重新编译。
随着时间的流逝,引擎接口提供的当前功能将被软件接口取代。 OpenSSL 3.0.0将保留引擎支持。 可以在不早于OpenSSL 4.0.0的情况下完全实现将来的体系结构。
当前架构
OpenSSL当前具有四个主要组件:
- libcrypto。 提供许多加密原语实现的主库。 此外,它为libssl和libcrypto提供了一套支持服务,以及诸如CMS和OCSP的协议实现。
- 引擎。 libcrypto的功能可以通过引擎API进行扩展。
通常,引擎是在libcrypto中动态加载的模块,并使用可用的钩子来实现密码算法,这通常是libcrypto已提供的算法的替代实现(例如,具有硬件加速支持),但它们也可能包含未在OpenSSL中实现的算法,例如:默认情况下(例如,GOST机制实现了俄罗斯的GOST系列算法)。 有些引擎随OpenSSL发行版一起提供,而其他引擎随第三方(同样是GOST)一起提供。
- libssl。 一个依赖libcrypto并实现TLS和DTLS协议的库。
- 应用领域 一组命令行工具,这些工具使用libssl和libcrypto的基本组件来提供一组密码和其他功能,例如:
- 密钥和参数的生成和验证
- 证书生成和验证
- SSL / TLS测试工具
- ASN.1验证
- 和其他
OpenSSL当前具有以下功能:
- 执行副总裁 EVP层(信封)API提供了用于加密功能的高级抽象接口,而无需绑定到特定的实现。 不建议绕过EVP接口直接使用加密算法的特定实现。 它还提供复合操作,例如签名和验证。 还提供了一些复合操作作为EVP级别的操作(例如,HMAC-SHA256)。 EVP还允许以算法不可知的方式使用密码算法(例如,EVP_DigestSign可同时用于RSA和ECDSA算法)。
- 不支持FIPS140,它仅在当前体系结构之前的OpenSSL-1.0.2中可用,并且与API或ABI不兼容。
组件概念
现有的体系结构是一个简单的四层结构,其底部具有一个加密层。 TLS层取决于加密层,应用程序取决于TLS层和加密层。
注意:图中存在组件并不表示该组件是公共API或供最终用户直接访问/使用。

包装图
上述组件打包在库(libcrypto和libssl)和相应的内核接口以及用于启动各种应用程序的命令行可执行文件(openssl)中。 如下图所示。

未来架构
未来架构的特点:
- 内核服务构成了应用程序和提供程序(例如BIO,X509,SECMEM,ASN1等)使用的构造块。
- 供应商使用密码算法和支持服务。 提供者实现以下一项或多项功能:
- 该算法的加密原语:加密,解密,签名,哈希等。
- 算法的序列化,例如,将私钥转换为PEM文件的功能。 序列化可以是格式,也可以是当前不支持的格式。
- 存储加载程序后端。 OpenSSL当前随附一个引导加载程序,用于从文件中读取密钥,参数和其他元素。 供应商可以实施下载程序以从其他位置(例如,从LDAP目录)读取数据。
提供程序可以是完全自主的,也可以使用其他提供程序提供的服务或内核服务。 例如,应用程序可以对硬件加速器供应商实施的算法使用加密原语,但使用另一供应商的序列化服务将密钥导出为PKCS#12格式。
默认提供程序(包含OpenSSL加密算法当前实现的核心)将是“内置”的,但其他提供程序将能够在运行时动态加载。
遗留提供者的模块将为较旧的算法(例如DES,MDC2,MD2,Blowfish,CAST)提供加密实现。 我们将发布有关如何以及何时将算法从默认提供程序转变为过时的提供程序的规则。
实现OpenSSL FIPS加密模块的FIPS提供程序可以在运行时动态加载。
- 内核提供对应用程序提供商(和其他提供商)提供的服务的访问。 供应商允许内核访问方法。 内核是一种机制,通过它可以发现诸如算法之类的事物的特定实现。
内核实现了基于属性的搜索功能来查找算法。 例如,这将找到一种算法,其中“ fips = true”或“ keysize = 128,constant_time = true”。 详细信息将在后续项目文件中发布。
- 协议实现,例如TLS,DTLS。
未来的架构具有以下特点:
- EVP层成为通过供应商实施的服务的精简包装。 大多数呼叫都经过最少的预处理,后处理或根本不进行处理。
- 新的EVP API似乎会在内核中搜索用于任何EVP调用的算法的实现。
- 无论采用何种方式,信息都将以相同的方式在主库和供应商之间传递。
- 不推荐使用的API(例如不通过EVP层的低级加密API)将被排除。 请注意,有一些过时的API用于尚未过时的算法(例如,AES不是过时的算法,但是AES_encrypt是过时的API)。
- OpenSSL FIPS加密模块将实现为动态加载的提供程序。 它是自主的(即,它可能仅取决于内核提供的系统运行时库和服务)。
- 随着时间的推移,其他接口也可以转换为使用内核(例如,OSSL_STORE)。
- 使用引擎将交给供应商。 “再见,工程师,你好,供应商 。 ”
组件概念
下图概述了未来的OpenSSL体系结构的组件。
注意:图中存在组件并不表示该组件是公共API或供最终用户直接访问/使用。

此处显示以下组件:
- 应用程序:命令行实用程序:ca,密码,cms,dgst等。
- 协议:该组件提供使用标准协议在端点之间进行通信的功能:
- TLS协议:所有受支持的TLS / DTLS协议和服务基础架构的实现:
- SSL BIO:用于TLS通讯的BIO
- Statem:TLS状态机
- 记录:TLS记录层
- 其他协议
- CMS:实施加密消息语法标准
- OCSP:在线证书状态协议的实施
- TS:时间戳协议实现
- 支持服务:专为支持协议代码实施而设计的组件
- 数据包:用于读取协议消息的内部组件
- Wpacket:用于记录协议消息的内部组件
- 内核:这是将服务请求(例如加密)连接到服务提供商的基本组件。 它使供应商能够注册其服务及其财产。 内核还提供了查找具有服务应执行的给定属性集的服务的能力。 例如,加密服务的属性可以包括“ aead”,“ aes-gcm”,“ fip”,“ security-bits = 128”等。
- 默认提供程序:实现一组在内核中注册的默认服务。
- FIPS提供程序:实现一组已验证且可用于FIPS核心的服务。 包括以下支持服务:
- POST:开机自检
- KAT:已知答案测试
- 完整性检查
- 低级实现:这是一组实际上实现加密原语(以满足独立FIPS要求)的组件。
- 旧版算法提供程序:提供将通过EVP API提供的旧版算法的实现。
- 第三方提供商:不属于OpenSSL发行版。 第三方可以出售自己的供应商。
- 常规服务:构成应用程序和供应商使用的构造块(例如BIO,X509,SECMEM,ASN1等)。
- 不推荐使用的API。 “低级” API:此处的“过时”一词专门指API,而不是算法本身。 例如,AES并不是一种过时的算法,但是有针对它的过时的API(例如,AES_encrypt)。
包装图
上面的组件概念图中描述的各种组件都物理包装在:

以下是实际的软件包:
- 可执行文件是OpenSSL。 命令行应用程序。
- Libssl。 包含与TLS和DTLS直接相关的所有内容。 它的内容与当前的libssl相同。 请注意,某些支持服务将移至libcrypto。
- Libcrypto 该库包含以下组件:
- 主要服务的实现:X509,ASN1,EVP,OSSL_STORE等。
- 核心
- 非TLS或DTLS协议
- 协议支持服务(例如数据包和Wpacket)
- 默认提供程序,包含所有默认算法的实现
- Libcrypto的遗产。 提供传统的低级API。 这些API的算法实现可以来自任何提供商。
- FIPS模块。 包含一个FIPS提供程序,该提供程序实现一组经过FIPS验证并已在内核中注册的服务。
- 旧版模块。 包含一个过时的提供程序。