OpenSSL总体架构
-
软件包分为三个主要的功能部分:密码算法库 、 SSL协议库及应用程序
- MacOS,MS,OS/2及 VMS这几个目录,包含了在不同的 平台编译时的环境变量配置文件,在安装编译完成之后,这几个目录就没有作用了。
- bugs,certs,perl,shlib,times,tools 及 utils 目录都是一些辅助的目录 , 里面包含文件对于我们使用 OpenSSL进行工作并没有很多的帮助,所以可以不作深究。但是编译的时候还是需要的
- Crypto目录是 OpenSSL所有密码算法和一些 PKI相关标准源码存放的目录,也是 OpenSSL 最 重 要 的 一 个 目 录 。
- SSL 目 录 是 SSL 协 议 各 个 版 本 的 实 现 源 码 存 放 的 目 录 。
- Doc目录是 OpenSSL使用的说明文档存放的目录,这个目录对于 OpenSSL使用者来说具有 “芝麻开门”的作用。
- Apps目录存放了OpenSSL所有应用程序的源代码文件,也是研 究 OpenSSL API 的 很 好 的 例 子 。
- Demos 目 录 就 是 一 些 乐 意 奉 献 的 人 写 的 OpenSSL 应 用 的例子,在你开始使用 OpenSSL进行工作之前,可以看看这个目录,或许会有所帮助。
- Include 目 录 是 使 用 OpenSSL 的 库 进 行 编 程 的 时 候 可 能 需 要 使 用 到 的 一 些 头 文 件 。
- Test 目录是 OpenSSL一些自身功能测试源程序所在的地方。
注意事项
- 如果在 Windows平台下将 OpenSSL编译成功后,还会增加三个新的目录:Inc32, Out32dl,Tmp32dl。
- Inc32目录和Include目录相似,存放的是 Windows平台下使用 OpenSSL进行编程需要包含的头文件。
- Out32dl则存放了 OpenSSL编译成功后的可执行应用程序、链接库 LIB文件和动态 DLL 文件。
- Tmp32dl则是在编译过程中存放 OBJ等 临时文件的目录。
OpenSSL算法目录
- Crypto 目录包含了OpenSSL密码算法库的所有源代码文件, 是 OpenSSL中最重要的目录之一。
- OpenSSL的密码算法库包含了 OpenSSL中所有密码算法、密钥管理和证书管理相关标准的实现
- 在 Windows下编程后的库文件名为libeay32.lib, 在 Linux 下 编 译后生成的库文件名为 libcrypto.a。 Crypto目录下包含了众多的子目录,这些子目录大多数以相关的算法或标准名称的简写命名。
- 当然,并非所有这 些目录存放的源文件都是密码算法和标准,有些是 OpenSSL本身的一些相关功能文件, 如 BIO,DSO 和 EVP 等
- 对称加密算法8种,非对称加密算法4种,信息摘要算法5种。
openssl文档目录
- OpenSSL的文档使用Perl文档格式保存,为 “.pod”文件,对于 Windows平台的用户,阅读这样的文档可能存在一些麻烦,可以使用Perl工具pod2text或者pod2html 指令将文档转换成txt文本格式或者html格式以方便阅读。
- doc文档涉及到 应用程序说明文档、密码算法库 API文档及SSL协议库API文档
- 应用程序说明文档目录 (Apps)包含了大部分OpenSSL应用程序的使用和参数说明,并有部分例子。
- 密码算法库API文档 (Crypto)则包含了部分OpenSSL密码算法库的API的使用说明,可惜不是很全面。
- SSL协议库 API文档包含了 OpenSSL实现的SSL协议和 TLS协议的大部分 API使用说明,该部分由于变动比较缓慢,所以文档相对全面一些。此外, 目前版本的 OpenSSL文档目录下还有一个 Howto子目录,现在只有一个文件,内容是关于证书的一些问题,希望后续的版本能够丰富这个 Howto目录。
- OpenSSL文档目录的根目录下还有个综述性质的文档 ssleay.txt 和 openssl.txt, 也是值得一看的 。
Openssl的功能
对称加密算法
- OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流 加密算法是 RC4。这7种分组加密算法分别是 AES,DES,Blowfish,CAST,IDEA,RC2,RC5,都支持电子密码本模式 (ECB)、加密分组链接模式 (CBC)、加密反馈模式 (CFB)和输出反馈模式 (OFB)四种常用的分组加密模式。
- 其中,AES使用的加密反馈模式 (CFB)和输出反馈模式 (OFB)分组长度是128位,其他算法使用的则是64位。
- 事实上,DES算法里面不仅仅是常用的 DES算法,还支持三个密钥和两个密钥的3DES 算法。
- OpenSSL 还使用EVP封装了所有的对称加密算法,使得各种对称加密算法能够使用统一的 API接口EVP_Encrypt 和 EVP_Decrypt 进行数据的加密和解密 ,大大 提高了代码的可重用性能 。
非对称加密算法
- OpenSSL一共实现了4种非对称加密算法,包括 DH 算法、RSA 算法、DSA 算法和 椭圆曲线算法 (EC)。
- DH算法一般用于密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。
- DSA 算法则一般只用于数字签名。
- OpenSSL 也使用EVP技术对不同功能的非对称加密算法进行封装,提供了统一的 API接口。如果使用非对称加密算法进行密钥交换或者密钥加密, 则使用 EVP_Seal 和 EVP_Open 进行加密和解密 ; 如果使用非对称加密算法进行数字签名 ,则使用 EVP_Sign 和 EVP_Verify 进行签名和验证 。
信息摘要算法
-
OpenSSL实现了5种信息摘要算法,分别是 MD2,MD5,MDC2,SHA (SHA1)和 RIPEMD。SHA 算法事实上包括了SHA 和 SHA1两种信息摘要算法 。 此外 , OpenSSL还实现了 DSS标准中规定的两种信息摘要算法 DSS和 DSS1。
-
OpenSSL 采用EVP_Digest 接口作为信息摘要算法统 一 的 EVP 接 口 , 对所有信息摘要算法进行了封装,提高了代码的重用性。当然,跟对称加密算法和非对称加密算法不一 样,信息摘要算法是不可逆的,不需要一个解密的逆函数。
密钥和证书管理
- 密钥和证书管理是PKI的一个重要组成部分 , OpenSSL 为之提供了丰富的功能 , 支持多种标准
- 首先,OpenSSL实现了 ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥 、 证 书请求及CRL 等数据对象的DER , PEM 和 BASE64 的编解码功能 。 OpenSSL 提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥 的 DER 编解码功能 , 并实现了私钥的PKCS#12 和 PKCS#8 的编解码功能 。 OpenSSL 在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。
- 在此基础上,OpenSSL实现了对证书的 X.509标准编解码、PKCS#12格式的编解 码及 PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证 书密钥产生、请求产生、证书签发、吊销和验证等功能。
- 事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心 (CA),实现 了证书签发的整个流程和证书管理的大部分机制。
SSL 和TLS 协议
- 虽然已经有众多的软件实现了SSL的功能,但是OpenSSL里面实现的SSL协议能够让我们对SSL协议有一个更加清楚的认识,因为至少存在两点:一是OpenSSL实现的SSL协议是开放源代码的,我们可以研究SSL协议实现的每一个细节;二是OpenSSL实现的SSL协议是纯粹的SSL协议,没有跟其他协议(如HTTP)协议结合在一起。由于SSL协议现在经常跟HTTP协议在一起应用形成HTTPS协议,所以很多人误认为SSL协议就是为了保护Web安全性的,这实在是一个很大的解!
- OpenSSL实现了SSL协议的SSLv2和SSLv3,支持了其中绝大部分的算法协议。OpenSSL也实现了TLSv1.0,TLS是SSLv3的标准化版,虽然区别不大,但毕竟有很多细节不尽相同。OpenSSL除了提供使用SSL协议和TLS协议的API接口函数之外,还提供了两个不错的应用程序S_Client和S_Server。S_Client用来模拟SSL客户端,可以用来测试SSL服务器,比如IIS和带mod_ssl的Apache等;而S_Server模拟了一个SSL服务器,可以用来测试SSL客户端,比如IE和Netscape等。事实上,由于是开放源代码的,S_Client和S_Server程序的源代码还是很好的OpenSSL的SSL接口API使用例子
应用程序
- 现在OpenSSL的应用中,很多都是基于OpenSSL的应用程序而不是其API的,如OpenCA,就是完全使用OpenSSL的应用程序实现的。OpenSSL的应用程序是基于OpenSSL的密码算法库和SSL协议库写成的,所以也是一些非常好的OpenSSL的API使用范例,
- OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试,以及其他辅助配置功能。表4.4是OpenSSL-0.9.7版本的指令列表。在表4.4中,根据指令的性质,对指令进行了归类,这些归类不一定科学。
- 这些类型包括:对称密钥指令、非对称密钥指令、信息摘要和签名指令、证书签发和管理指令、标准转换指令、SSL测试指令及其他指令。
Engine机制
-
Engine机制的目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。
-
目前,OpenSSL的0.9.7版本支持的内嵌第三方加密设备有8种,包括:CryptoSwift,nCipher,Atala,Nuron,UBSEC,Aep,SureWare及IBM4758CCA的硬件加密设备。现在还出现了支持PKCS#11接口的Engine接口,支持微软CryptoAPI的接口也有人进行开发。当然,所有上述Engine接口支持不一定很全面
BIO机制
- BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供的API的复杂性也降低了很多。前面介绍的EVP封装也提高了OpenSSL代码的可重用性。
OpenSSL的应用
- penSSL的应用一般可以分为两种不同的方式:基于OpenSSL指令的应用和基于OpenSSL加密库和协议库的应用。前者更容易一些,而后者需要做的工作更多一些。当然,这些应用不一定是截然分开的,你当然可以两种都用一点,比如使用SSL协议的API,但是证书可以使用OpenSSL的指令签发。
参考链接
- GitHub - openssl/openssl: TLS/SSL and crypto library
- openssl/openssl - Sourcegraph