OpenSSL 战略架构

介绍

该文件概述了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目前具有以下特点:

  1. EVP:EVP(envelope)API层提供了高级抽象接口,可将加密功能与具体的实现绑定分开。不鼓励通过EVP层之外的接口直接使用具体的加密算法实现。EVP层还提供了签名和验证等组合操作。某些组合操作也作为EVP层操作提供(如HMAC-SHA256)。EVP还允许以与算法无关的方式使用加密算法(例如,EVP_DigestSign适用于RSA和ECDSA算法)。

  2. 不支持FIPS 140。FIPS 140仅在OpenSSL-1.0.2中可用,它早于现行架构,不兼容API或ABI。

概念组件视图

现有架构是一个简单的4层分层结构,加密层位(crypto layer)于最底层。TLS层依赖于加密层,而应用程序则依赖于TLS和加密层。

注意:图中存在的组件并不表示该组件是公共API或用于最终用户直接访问或使用的。

OpenSSL 战略架构_第1张图片

包视图

上述组件被打包成库(libcrypto和libssl)和相关的引擎接口,以及一个名为“openssl”的命令行可执行文件,用于运行各种应用程序。下面的图示说明了这一点。
OpenSSL 战略架构_第2张图片

未来架构

未来架构具有以下特点:

  • 核心服务是应用程序和提供者可用的构建模块(例如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,也不表示其供最终用户直接访问或使用。
OpenSSL 战略架构_第3张图片

这里所示的组件如下:

  • 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: 用于写入协议消息的内部组件
  • Core: 这是一个连接服务请求(例如加密)与该服务的提供者的基本组件。它实现了提供者注册其服务以及这些服务的属性的能力。它还提供了根据服务必须满足的一组属性来定位服务的能力。例如,加密服务的属性可能包括 “aead”、 “aes-gcm”、 “fips”、 “security-bits=128” 等。

  • Default Provider: 实现了一组已注册到 Core 的默认服务。

    • 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 战略架构_第4张图片

此处显示的物理包包括:

  • 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

你可能感兴趣的:(架构)