openssl介绍
密码学标准和我们平常所见的互联网协议一样,是一种大家都遵守的约定和标准,比如PKCS#1中规定了 RSA 秘钥时怎么生成的,公私钥的格式等内容,x509标准规定了证书的格式等。
OpenSSL 本质就是一个工具集,按照主流的密码学标准实现了常用的加密算法,证书的生成、签名、验签等功能。
因为网络上的资料比较杂,有的是一些比较老的版本,有的又不完整,所以自己稍加总结,方便以后重新查阅。而学习 OpenSSL 的目的只是为了加深对密码学基础内容的理解和一些知识点的验证,不是密码学的开发人员暂时不需要去研究 OpenSSL 源码,有这功夫还不如多补补算法、C/C++、编译原理、数据结构等底层知识,所以本文只会建立 OpenSSL 大概的使用框架以及主流功能,完整的功能及其溯源不再本文讨论范围。
本文将分三类讲述 OpenSSL 指令的使用,其中也只讲解常用的指令:dgst、enc、rsa指令集合、req、x509、pkcs12。CA 指令因为在平时较少使用,暂不研究。
非对称加密
OpenSSL 一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA 算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名, 这里主要演示 RSA 算法,需要使用DH算法的可以自行研究 pkey 指令集合。
genrsa指令
genrsa
指令虽然已经被功能更加全面的genpkey
指令取代,但是因为其相对简单,功能纯粹,可以作为学习genpkey
的基础。另外,genpkey
中的一些更详细的功能在现阶段使用不到,使用genrsa
直接生成私钥相对简单方便,容易掌握。其可选参数如下:
usage: genrsa [args] [numbits]
-out file output the key to 'file'(输出的文件名)
-passout arg output file pass phrase source(给输出的文件设置密码,此处不同于对称算法加密,对称算法是对私钥结果进行加密,这里是对文件加密)
-f4 use F4 (0x10001) for the E value(使用65537作为E的值,E在RSA算法中使用场景为:1<e<φ(n) ,默认)
-3 use 3 for the E value(使用3作为E的值,非默认)
// 以下为对称加密选项
-des encrypt the generated key with DES in cbc mode
-des3 encrypt the generated key with DES in ede cbc mode (168 bit key)
-aes128, -aes192, -aes256
encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
encrypt PEM output with cbc camellia
genrsa
接两个参数,第一个选项参数,第二个为rsa算法中的m值的长度,一般为1024,更高安全级别的位2048。其中,如果不设置对称加密的算法,则不会对私钥结果进行加密,如果不为空,则会要求输入对称算法中将要使用的秘钥,使用如下:
1、生成私钥
openssl genrsa -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
..............++++++
...............................++++++
e is 65537 (0x10001)
得到的结果为:

2、生成私钥并使用对称算法对秘钥进行加密
openssl genrsa -aes128 -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
....................................................++++++
.................++++++
e is 65537 (0x10001)
Enter pass phrase for private.pem:123456
Verifying - Enter pass phrase for private.pem:123456
结果:

rsa指令
rsa功能比较多,可以对秘钥进行管理。其中最主要的功能就是从私钥中提取公钥、查看秘钥的结构信息,可以使用-help查看:
usage: rsa [options]
-check 检测秘钥合法性
-in file 输入的文件名
-inform format 输入文件的格式 (DER, NET or PEM (default))
-modulus 打印 RSA 秘钥的modulus
-out file 输出的文件名
-outform format 输出文件的格式(DER, NET or PEM (default PEM))
-passin src 输入文件的密码
-passout src 输出文件的密码
-pubin 该指令说明输入的是公钥,默认为私钥
-pubout 该指令说明需要输出公钥,默认输出私钥
-sgckey what it is?
-text 打印信息
其中,ciphername可选值有-AES-192-CBC等等,可以通过-help指令查看,此处不再列出。主要功能演示如下:
1、查看秘钥信息
openssl rsa -in private.pem -text
结果:

2、从私钥中提取公钥
openssl rsa -in private.pem -pubout -out public.pem
3、给秘钥添加/去除/修改对称加密的密码
// 为RSA密钥增加口令保护
openssl rsa -in RSA.pem -des3 -passout pass:123456 -out E_RSA.pem
// 为RSA密钥去除口令保护
openssl rsa -in E_RSA.pem -passin pass:123456 -out P_RSA.pem
// 修改加密算法为aes128,口令是123456
openssl rsa -in RSA.pem -passin pass:123456 -aes128 -passout pass:123456 -out E_RSA.pem
4、转换秘钥格式
// 把pem格式转化成der格式,使用outform指定der格式
openssl rsa -in RSA.pem -passin pass:123456 -des -passout pass:123456 -outform der -out rsa.der
rsautl指令
以上两个指令时生成和管理秘钥,而rsautl
指令则和秘钥的具体使用有关,也就是如何使用 rsa 秘钥进行加密解密操作。
Usage: rsautl [options]
// 输入文件(被加密/解密/签名)和输出文件
-in file 被操作的文件
-out file 操作完成后的输出文件
// 输入的秘钥
-inkey file 完成操作时使用到的秘钥
// 集中填充方式
-ssl use SSL v2 padding
-raw use