OpenSSL之简介,安装及组成介绍

大耗子 2020年06月20日 181次浏览

文章链接:https://codemouse.online/archives/2020-06-20185901

OpenSSL

OpenSSL是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证书验证、PKCS7标准实现和PKCS12个人数字证书格式实现等功能。
OpenSSL采用C语言作为开发语言,这使得它具有优秀的跨平台性能。OpenSSL支持Linux、UNIX、windows、Mac等平台。
OpenSSL目前最新的版本是1.0.2t

OpenSSL 安装

点击下载:openssl-1.0.0s.tar.gz
或者官网下载:https://www.OpenSSL.org/source/

tar xzvf OpenSSL-1.1.0l.tar.gz
cd OpenSSL-1.1.0l
./config –prefix=/usr/local/OpenSSL
make 
sudo make install

OpenSSL源代码目录组成

OpenSSL源代码主要由eay库、ssl库、工具源码、范例源码以及测试源码组成。eay库是基础的库函数,提供了很多功能。
源代码放在crypto目录下。包括如下内容:

  1. asn.1 DER编码解码(crypto/asn1目录),它包含了基本asn1对象的编解码以及数字证书请求、数字证书、CRL撤销列表以及PKCS8等最基本的编解码函数。这些函数主要通过宏来实现。
  2. 抽象IO(BIO,crypto/bio目录),本目录下的函数对各种输入输出进行抽象,包括文件、内存、标准输入输出、socket和SSL协议等。
  3. 大数运算(crypto/bn目录),本目录下的文件实现了各种大数运算。这些大数运算主要用于非对称算法中密钥生成以及各种加解密操作。另外还为用户提供了大量辅助函数,比如内存与大数之间的相互转换。
  4. 字符缓存操作(crypto/buffer目录)。
  5. 配置文件读取(crypto/conf目录),OpenSSL主要的配置文件为OpenSSL.cnf。本目录下的函数实现了对这种格式配置文件的读取操作。
  6. DSO(动态共享对象,crypto/dso目录),本目录下的文件主要抽象了各种平台的动态库加载函数,为用户提供统一接口。
  7. 硬件引擎(crypto/engine目录),硬件引擎接口。用户如果要写自己的硬件引擎,必须实现它所规定的接口。
  8. 错误处理(crypto/err目录),当程序出现错误时,OpenSSL能以堆栈的形式显示各个错误。本目录下只有基本的错误处理接口,具体的的错误信息由各个模块提供。各个模块专门用于错误处理的文件一般为*_err..c文件。
  9. 对称算法、非对称算法及摘要算法封装(crypto/evp目录)。
  10. HMAC(crypto/hmac目录),实现了基于对称算法的MAC。
  11. hash表(crypto/lhash目录),实现了散列表数据结构。OpenSSL中很多数据结构都是以散列表来存放的。比如配置信息、ssl session和asn.1对象信息等。
  12. 数字证书在线认证(crypto/ocsp目录),实现了ocsp协议的编解码以及证书有效性计算等功能。
  13. PEM文件格式处理(crypto/pem),用于生成和读取各种PEM格式文件,包括各种密钥、数字证书请求、数字证书、PKCS7消息和PKCS8消息等。
  14. pkcs7消息语法(crypto/pkcs7目录),主要实现了构造和解析PKCS7消息;
  15. pkcs12个人证书格式(crypto/pckcs12目录),主要实现了pkcs12证书的构造和解析。
  16. 队列(crypto/pqueue目录),实现了队列数据结构,主要用于DTLS。
  17. 随机数(crypto/rand目录),实现了伪随机数生成,支持用户自定义随机数生成。
  18. 堆栈(crypto/stack目录),实现了堆栈数据结构。
  19. 线程支持(crypto/threads),OpenSSL支持多线程,但是用户必须实现相关接口。
  20. 文本数据库(crypto/txt_db目录)。
  21. x509数字证书(crypto/x509目录和crypto/x509v3),包括数字证书申请、数字证书和CRL的构造、解析和签名验证等功能了;
  22. 对称算法(crypto/aes、crypto/bf、crypto/cast、ccrypto/omp和crypto/des等目录)。
  23. 非对称算法(crypto/dh、crypto/dsa、crypto/ec和crypto/ecdh)。
  24. 摘要算法(crypto/md2、crypto/md4、crypto/md5和crypto/sha)以及密钥交换/认证算法(crypto/dh 和crypto/krb5)。

ssl库所有源代码在ssl目录下,包括了sslv2、sslv3、tlsv1和DTLS的源代码。各个版本基本上都有客户端源码(_clnt.c)、服务源码(_srvr.c)、通用源码(_both.c)、底层包源码(_pkt.c)、方法源码(_meth.c)以及协议相关的各种密钥计算源码(_enc.c)等,都很有规律。

主要的源代码

apps目录下的各个程序,对应于OpenSSL的各项命令,可以单独编译;
demos下的各种源代码;
engines下的各种硬件engine实现;
test目录下的各种测试源代码。
对于OpenSSL函数的学习,主要查看OpenSSL自身是如何调用的,或者查看函数的实现。

学习重点

  1. 哈希
  2. BIO(抽象IO,相当于一个小的文件系统)
  3. base64(可以将无可见的数据变得可见)
  4. md4,md5,SHA1,SHA256,SHA512(检查文件完整性的校验)
  5. RSA(非对称加密)