介绍
该文件概述了OpenSSL的战略架构。从3.0.0版本开始,将需要多个发布版本来将当前的“现状”(1.1.1)架构迁移到未来的“目标”架构。
未来的架构预计会有大量变化。我们将提供处理最终过渡的迁移路径。OpenSSL 3.0.0版本对绝大多数现有应用程序的影响将很小,几乎所有良好的应用程序只需要重新编译即可。
随着时间的推移,当前通过引擎(engine) 接口提供的功能将替换为通过 provider 提供的接口。OpenSSL 3.0.0 将继续支持引擎(engine)。未来的架构最早要到 OpenSSL 4.0.0 才能完全实现。
当前架构
目前,OpenSSL 分为四个主要组件:
-
libcrypto:这是用于提供大量加密原语实现的核心库。此外,它还提供了一组由 libssl 和 libcrypto 使用的支持服务,以及 CMS 和 OCSP 等协议的实现。
-
引擎:通过引擎API,可以扩展libcrypto的功能。
通常情况下,引擎是动态可加载的模块,注册到libcrypto,并利用可用的钩子提供加密算法的实现。通常这些是对libcrypto已有算法的替代实现(例如,用于实现算法的硬件加速),但它们也可以包括默认OpenSSL中未实现的算法(例如,GOST引擎实现了GOST算法系列)。一些引擎是作为OpenSSL发行版的一部分提供的,而一些是由外部第三方提供的(同样是GOST)。 -
libssl:这个库依赖于libcrypto,并实现了TLS和DTLS协议。
-
应用程序:这些应用程序是一组命令行工具,使用底层的libssl和libcrypto组件,提供一系列的加密和其他功能,比如:
a. 密钥和参数的生成与检查
b. 证书的生成与检查
c. SSL/TLS测试工具
d. ASN.1检查
e. 等等
OpenSSL目前具有以下特点:
-
EVP:EVP(envelope)API层提供了高级抽象接口,可将加密功能与具体的实现绑定分开。不鼓励通过EVP层之外的接口直接使用具体的加密算法实现。EVP层还提供了签名和验证等组合操作。某些组合操作也作为EVP层操作提供(如HMAC-SHA256)。EVP还允许以与算法无关的方式使用加密算法(例如,EVP_DigestSign适用于RSA和ECDSA算法)。
-
不支持FIPS 140。FIPS 140仅在OpenSSL-1.0.2中可用,它早于现行架构,不兼容API或ABI。
概念组件视图
现有架构是一个简单的4层分层结构,加密层位(crypto layer)于最底层。TLS层依赖于加密层,而应用程序则依赖于TLS和加密层。
注意:图中存在的组件并不表示该组件是公共API或用于最终用户直接访问或使用的。
包视图
上述组件被打包成库(libcrypto和libssl)和相关的引擎接口,以及一个名为“openssl”的命令行可执行文件,用于运行各种应用程序。下面的图示说明了这一点。
未来架构
未来架构具有以下特点:
-
核心服务是应用程序和提供者可用的构建模块(例如BIO、X509、SECMEM、ASN1等)。
-
提供者(provider)实现加密算法和支持服务。提供者可以有以下一项或多项实现:
- 针对算法的加密原语(cryptographic primitives),例如如何进行加密/解密/签名/哈希等操作。
- 算法的序列化,例如如何将私钥转换为PEM文件。序列化可以在与当前不支持的格式之间的转换。
- 存储加载器后端。OpenSSL目前具有从文件中读取密钥、参数和其他项的存储加载器。提供者可以有一个从其他位置(例如LDAP目录)加载的加载器。
提供者可以是完全独立的,也可以使用由不同提供者或核心(Core)服务提供的服务。例如,一个应用程序可以使用由硬件加速提供者(hardware accelerated provider)实现的算法的加密原语,但使用不同提供者的序列化服务,以便将密钥导出为PKCS#12格式。
一个默认提供者(包含当前OpenSSL加密算法实现的核心部分)将被“内置”,但其他提供者可以在运行时动态加载。
传统提供者(Legacy provider)模块将为旧算法提供加密实现(例如DES、MDC2、MD2、Blowfish、CAST)。OMC将发布一个策略,说明何时以及如何将算法从默认提供者迁移到传统提供者。
一个具体实现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可能会考虑进行这样的过渡)。
引擎的使用将逐步转变为提供者(Providers)。“Bye-bye-Engines, Hello-Providers”.
概念组件视图
以下是OpenSSL待实现架构中概念组件的概述,如下图(粉红色涅槃)所示。
注意:图中组件的存在并不表示该组件是公共API,也不表示其供最终用户直接访问或使用。
这里所示的组件如下:
-
Applications: 命令行应用程序,例如 ca, ciphers, cms, dgst 等
-
Protocols: 提供根据标准协议在端点之间进行通信的功能
- TLS 协议:所有支持的 TLS/DTLS 协议的实现以及支持基础设施,例如:
- SSL BIO: 用于使用 TLS 进行通信的 BIO
- Statem: TLS 状态机
- Record: TLS 记录层
- 其他协议
- CMS: 密码消息语法(Cryptographic Message Syntax)标准的实现
- OCSP: 在线证书状态协议(Online Certificate Status Protocol)的实现
- TS: 时间戳协议的实现
- Supporting Services: 专门设计以支持协议代码实现的组件
- Packet: 用于读取协议消息的内部组件
- Wpacket: 用于写入协议消息的内部组件
- TLS 协议:所有支持的 TLS/DTLS 协议的实现以及支持基础设施,例如:
-
Core: 这是一个连接服务请求(例如加密)与该服务的提供者的基本组件。它实现了提供者注册其服务以及这些服务的属性的能力。它还提供了根据服务必须满足的一组属性来定位服务的能力。例如,加密服务的属性可能包括 “aead”、 “aes-gcm”、 “fips”、 “security-bits=128” 等。
-
Default Provider: 实现了一组已注册到 Core 的默认服务。
- Supporting Services
- 低级别实现: 实际实现密码原语的一组组件。
- Supporting Services
-
FIPS 提供者: 实现了经过 FIPS 验证的一组服务,并提供给 Core 使用。这包括以下支持服务:
- POST: 开机自检(Power On Self Test)
- KAT: 已知答案测试(Known Answer Tests)
- 完整性检查(Integrity Check)
- 低级别实现: 实际实现密码原语的一组组件(以符合 FIPS 规定的独立自包含要求)。
-
Legacy Provider: 提供了将通过 EVP 级别 API 公开的旧算法的实现。
-
Third-Party Provider: 不属于 OpenSSL 发行版的第三方提供者。第三方可以实现自己的提供者。
-
Common Services: 这些是应用程序和提供者可用的构建模块(例如 BIO、X509、SECMEM、ASN1 等)。
-
遗留 API。 “低级” API。 “遗留” 这里指的是 API,而不是算法本身。例如,AES 不是一个遗留算法,但它有一个遗留 API(例如 AES_encrypt)。
包视图
上面概念组件视图中描述的各个组件被物理打包成:
-
可执行应用程序,供用户使用
-
用于应用程序的库
-
用于 Core 的可动态加载模块。
此处显示的物理包包括:
-
OpenSSL 可执行文件。命令行应用程序。
-
Libssl. 其中包含与 TLS 和 DTLS 直接相关的所有内容。其内容与现有架构中的 libssl 大体相同。请注意,一些支持服务将被移动到 libcrypto 中。
-
Libcrypto. 这个库包含以下部分:
- 核心服务的实现,如 X509、ASN1、EVP、OSSL_STORE 等
- 核心(Core)
- 与 TLS 或 DTLS 无关的协议
- 协议支持服务(例如 Packet 和 Wpacket)
- 包含所有默认算法实现的默认提供程序
-
Libcrypto-legacy. 提供遗留的“低级”API。这些API的算法实现可以来自任何提供程序。
-
FIPS 模块. 包含实现了一组经过 FIPS 验证并已在核心中注册的服务的 FIPS 提供程序。
-
遗留模块(Legacy module). 包含了遗留提供程序。
ref: https://www.openssl.org/docs/OpenSSLStrategicArchitecture.html