OpenSSL 是一个功能丰富的开源软件包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份;本文主要介绍其基本概念及安装,文中所使用到的软件版本:OpenSSL 1.1.1s、CentOS7.9.2009。

1、OpenSSL 概念1.1、SSL 简介SSL 是 Secure Sockets Layer(安全套接层协议)的缩写,可以在 Internet 上提供秘密性传输。Netscape 公司在推出第一个Web浏览器的同时,提出了 SSL 协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为 Internet 上保密通讯的工业标准。SSL 能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL 协议要求建立在可靠的传输层协议(TCP)之上。SSL 协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于 SSL 协议之上。SSL 协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。1.2、安全信道的特性1.2.1、数据保密性

信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密钥来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密钥要用一个安全的方法传送。加密过的数据可以公开地传送。

1.2.2、数据完整性

加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。

1.2.3、安全验证

加密的另外一个用途是用来作为个人的标识,用户的密钥可以作为他的安全验证的标识。SSL 是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。

1.3、OpenSSL 的功能1.3.1、基本功能

OpenSSL 整个软件包大概可以分成三个主要的功能部分:SSL 协议库、应用程序以及密码算法库。OpenSSL 的目录结构自然也是围绕这三个功能部分进行规划的。

作为一个基于密码学的安全开发包,OpenSSL 提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

1.3.2、辅助功能

BIO 机制是 OpenSSL 提供的一种高层 IO 接口,该接口封装了几乎所有类型的 IO 接口,如内存访问、文件访问以及 Socket 等。这使得代码的重用性大幅度提高,OpenSSL 提供 API 的复杂性也降低了很多。

OpenSSL 对于随机数的生成和管理也提供了一整套的解决方法和支持 API 函数。随机数的好坏是决定一个密钥是否安全的重要前提。

OpenSSL 还提供了其它的一些辅助功能,如从口令生成密钥的 API,证书签发和管理中的配置文件机制等等。如果你有足够的耐心,将会在深入使用 OpenSSL 的过程慢慢发现很多这样的小功能,让你不断有新的惊喜。

1.4、算法1.4.1、密钥证书管理

密钥和证书管理是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),实现了证书签发的整个流程和证书管理的大部分机制。

1.4.2、SSL 和 TLS 协议

OpenSSL 实现了 SSL 协议的 SSLv2 和 SSLv3,支持了其中绝大部分算法协议。OpenSSL 也实现了 TLSv1.0,TLS 是 SSLv3 的标准化版,虽然区别不大,但毕竟有很多细节不尽相同。

虽然已经有众多的软件实现了 OpenSSL 的功能,但是 OpenSSL 里面实现的 SSL 协议能够让我们对 SSL 协议有一个更加清楚的认识,因为至少存在两点:一是 OpenSSL 实现的 SSL 协议是开放源代码的,我们可以追究 SSL 协议实现的每一个细节;二是 OpenSS L实现的 SSL 协议是纯粹的 SS L协议,没有跟其它协议(如HTTP)协议结合在一起,澄清了 SSL 协议的本来面目。

1.4.3、对称加密

OpenSSL 一共提供了多种对称加密算法,其中 RC4 是流加密算法 ,其它的是分组加密算法,如:AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES 使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是 128 位,其它算法使用的则是 64 位。事实上,DES 算法里面不仅仅是常用的 DES 算法,还支持三个密钥和两个密钥 3DES 算法。

1.4.4、非对称加密

OpenSSL 一共实现了多种非对称加密算法,如:DH 算法、RSA 算法、DSA 算法和椭圆曲线算法(EC)。DH 算法一般用于密钥交换。RSA 算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA 算法则一般只用于数字签名。

1.4.5、信息摘要

OpenSSL 实现了多种信息摘要算法,如:MD4、MD5、MDC2、SHA。

2、OpenSSL 安装2.1、下载源码

https://www.openssl.org/source/

这里下载 1.1.1s 版本,下载后解压:

tar zxvf openssl-1.1.1s.tar.gz

2.2、默认路径安装

进入到源码目录后,执行如下命令:

$ ./config$ make$ make test$ make install

该安装方式默认会安装到/usr/local 目录下,所以需要使用 root 用户或有 sudo 权限的用户来安装。

2.3、自定义路径安装

该安装方式通过自定义安装目录从而可以使用普通用户来安装 OpenSSL:

shell> ./config --prefix=/home/mongo/soft/openssl-1.1.1s --openssldir=/home/mongo/soft/openssl-1.1.1s/ssl  -Wl,-rpath,/home/mongo/soft/openssl-1.1.1s/libshell> makeshell> make testshell> make install

参数说明:

–prefix OpenSSL 的安装目录
–openssldir OpenSSL配置文件的目录,以及证书和密钥的默认目录
-Wl,-rpath 运行时指定引用库的位置

更多详细的安装说明可参考源码目录中安装说明文件:INSTALL

2.4、简单使用2.4.1、查看使用方法

执行openssl help 查看用法:

shell> /home/mongo/soft/openssl-1.1.1s/bin/openssl helpStandard commandsasn1parse         ca                ciphers           cms               crl               crl2pkcs7         dgst              dhparam           dsa               dsaparam          ec                ecparam           enc               engine            errstr            gendsa            genpkey           genrsa            help              list              nseq              ocsp              passwd            pkcs12            pkcs7             pkcs8             pkey              pkeyparam         pkeyutl           prime             rand              rehash            req               rsa               rsautl            s_client          s_server          s_time            sess_id           smime             speed             spkac             srp               storeutl          ts                verify            version           x509              Message Digest commands (see the `dgst' command for more details)blake2b512        blake2s256        gost              md4               md5               mdc2              rmd160            sha1              sha224            sha256            sha3-224          sha3-256          sha3-384          sha3-512          sha384            sha512            sha512-224        sha512-256        shake128          shake256          sm3               Cipher commands (see the `enc' command for more details)aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       aes-256-cbc       aes-256-ecb       aria-128-cbc      aria-128-cfb      aria-128-cfb1     aria-128-cfb8     aria-128-ctr      aria-128-ecb      aria-128-ofb      aria-192-cbc      aria-192-cfb      aria-192-cfb1     aria-192-cfb8     aria-192-ctr      aria-192-ecb      aria-192-ofb      aria-256-cbc      aria-256-cfb      aria-256-cfb1     aria-256-cfb8     aria-256-ctr      aria-256-ecb      aria-256-ofb      base64            bf                bf-cbc            bf-cfb            bf-ecb            bf-ofb            camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         des               des-cbc           des-cfb           des-ecb           des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      des-ofb           des3              desx              idea              idea-cbc          idea-cfb          idea-ecb          idea-ofb          rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           rc2-cfb           rc2-ecb           rc2-ofb           rc4               rc4-40            seed              seed-cbc          seed-cfb          seed-ecb          seed-ofb          sm4-cbc           sm4-cfb           sm4-ctr           sm4-ecb           sm4-ofb

可以看到,OpenSSL命令主要分为三类:标准命令、消息摘要命令、加解密命令。

2.4.2、查看版本

执行openssl version 可以查看 OpenSSL 的版本:

shell> /home/mongo/soft/openssl-1.1.1s/bin/openssl versionOpenSSL 1.1.1s  1 Nov 2022

参考:https://baike.baidu.com/item/openssl/5454803