OpenSSL的基本使用
前言
OpenSSL 是使用非常广泛的 SSL 的开源实现。由于其中实现了为 SSL 所用的各种加密算法,因此 OpenSSL 也是被广泛使用的加密函数库。下面介绍一下 OpenSSL 的一些常用命令。
对称加密指令enc
OpenSSL的加密算法库提供了丰富的对称加密算法,我们可以通过OpenSSL提供的对称加密算法指令的方式使用,也可以通过调用OpenSSL提供的API的方式使用。
OpenSSL应用指令的名字基本上都是以对称加密算法本身的名字加上位数、加密模式或者其他属性组合而成。例如DES算法的CBC模式,其对应的指令就是des-cbc。可以通过命令 openssl enc help
查看当前版本的openssl支持的对称加密算法。
-in <file> 输入文件路径
-out <file> 输出文件路径
-pass <arg> 传入密码(如:-pass pass:123456 / -pass file:pass.txt)详细请自行查阅资料
-e 加密(默认)
-d 解密
-a/-base64 base64编解码
-md 指定密钥生成的摘要算法,用户输入的口令不能直接作为文件加密的密钥,而是经过摘要算法做转换,此参数指定摘要算法,默认md5
-S 为了增强安全性,在把用户密码转换成加密密钥的时候需要使用盐值,默认盐值随机生成。使用该参数,则盐值由用户指定。也可指用-nosalt指定不使用盐值,但降低了安全性,不推荐使用。
-K/-iv 默认文件的加密密钥的Key和IV值是有用户输入的密码经过转化生成的,但也可以由用户自己指定Key/IV值,此时pass参数不起作用
-[pP] 加上p参数会打印文件密钥Key和IV值,加上P参数也会打印文件密钥Key和IV值,但不进行真正的加解密操作
对文件进行对称加解密
echo openssltest > test.txt
openssl enc -des-cbc -in test.txt -out test1.txt -pass pass:123456 -p
openssl enc -d -des-cbc -in test1.txt -out test2.txt -pass pass:123456
解密使用错误的算法或者密码均会解密失败。使用-p参数可以打印出salt、key、iv值。
也可以使用密码文件进行加解密。
echo 123456 > pass.txt
openssl enc -des-cbc -in test.txt -out test1.txt -pass file:pass.txt -p
openssl enc -d -des-cbc -in test1.txt -out test2.txt -pass file:pass.txt
我们可以将test.txt和text2.txt中的内容进行对比,里面的内容应该是相同的。
对文件进行base64编解码
echo base64test > base64.txt
openssl enc -base64 -in base64.txt -out a.txt
openssl enc -base64 -d -in a.txt -out b.txt
查看base64.txt和b.txt中的内容,可知解码后的内容和原文相同。
非对称加密指令(仅介绍RSA算法相关指令)
目前常用的非对称加密算法有RSA, DH和DSA三种,但并非都可以用于密钥交换和数字签名。而是RSA可用于数字签名和密钥交换,DH算法可用于密钥交换,而DSA算法专门用户数字签名。
OpenSSL支持以上三种算法,并为三种算法提供了丰富的指令集,本文主要介绍RSA算法及相关指令,其它算法请读者自行查阅资料。
genrsa指令
genrsa主要用于生成RSA密钥对,其用法如下:
openssl genrsa [args] [numbits]
密钥长度建议1024位及以上
以下是常用参数:
-des //生成的密钥使用des方式进行加密
-des3 //生成的密钥使用des3方式进行加密
-seed //生成的密钥使用seed方式进行加密
-aes128, -aes192, -aes256 //生成的密钥使用aes方式进行加密
-camellia128, -camellia192, –camellia256 //生成的密钥使用camellia方式进行加密
-out file //生成的密钥文件路径,可从中提取公钥
-passout arg //指定密钥文件的加密口令,可从文件、环境变量、终端等输入
产生RSA密钥对
我们可以尝试产生一个1024位的RSA密钥对(后缀名也可以为.key)
openssl genrsa -out rsa.pem 1024
该密钥文件中包含公私钥对,查看rsa.pem文件时仅显示私钥
可以用如下指令导出公钥文件
openssl rsa -in rsa.pem -pubout -out pub.pem
未加密的密钥文件会产生安全问题,在生成密钥文件时,我们可以对密钥文件进行加密处理
openssl genrsa -out rsa1.pem -des -passout pass:123456 1024
rsa指令
rsa指令主要对密钥文件进行管理,其用法如下:
-inform arg //输入文件格式,默认pem格式(DER NET PEM)
-outform arg //输出文件格式,默认pem格式(DER NET PEM)
-in arg //输入文件
-passin arg //指定输入文件的加密口令,可来自文件、终端、环境变量等
-out arg //输出文件
-passout arg //指定输出文件的加密口令,可来自文件、终端、环境变量等
-des //使用des加密输出的文件
-des3 //使用des3加密输出的文件
-seed //使用seed加密输出的文件
-aes128, -aes192, -aes256 //使用aes加密输出的文件
-camellia128, -camellia192, -camellia256 //使用camellia加密输出的文件
-text //以明文形式输出各个参数值
-noout //不输出密钥到任何文件
-check //检查输入密钥的正确性和一致性
-pubin //指定输入文件是公钥
-pubout //指定输出文件是公钥
修改密钥文件的保护口令、导出公钥
对于没有保护口令的密钥文件rsa.pem,我们可以为其增加保护口令
openssl rsa -in rsa.pem -des3 -passout pass:123456 -out e_rsa.pem
去除e_rsa.pem的保护口令
openssl rsa -in e_rsa.pem -passin pass:123456 -out p_rsa.pem
经过比较rsa.pem和p_rsa.pem两个密钥文件是一样的
导出rsa.pem的公钥
openssl rsa -in rsa.pem -pubout -out pub.pem
rsautl指令
rsautl用于加解密操作和数字签名,其用法如下:
-in file //输入文件
-out file //输出文件
-inkey file //输入的密钥
-keyform arg //指定密钥格式
-pubin //指定输入的是RSA公钥
-certin //指定输入的是证书文件
-sign //使用私钥做签名
-verify //使用公钥认证签名
-encrypt //使用公钥加密
-decrypt //使用私钥解密
-passin arg //指定输入的密码
加解密操作
我们可以新建一个文件用于进行加解密操作
echo rsautltest > plain.txt
使用之前产生的密钥文件rsa.pem进行加密,实际上使用的是文件中的公钥
openssl rsautl -encrypt -in plain.txt -inkey rsa.pem -passin pass:123456 -out enc.txt
使用之前产生的密钥文件rsa.pem进行解密,实际上使用的是文件中的私钥
openssl rsatul -decrypt -in enc.txt -inkey rsa.pem -passin pass:123456 -out replain.txt
通过比较可以发现plain.txt和replain.txt文件是相同的。
注:每次RSA加密时会根据填充模式填充随机数,故每次加密结果是不同的。
数字签名
数字签名过程与非对称加密相反,使用私钥进行签名,使用公钥进行验签。请注意rsautl命令的签名验签本质上是加解密操作,没有增加摘要操作,故对于较大文件来说,无法进行签名。
使用之前产生的密钥文件rsa.pem进行签名,实际上使用的是文件中的私钥
openssl rsautl -sign -in plain.txt -inkey rsa.pem -passin pass:123456 -out sign.txt
使用之前产生的密钥文件rsa.pem进行验签,实际上使用的是文件中的公钥
openssl rsautl -verify -in sign.txt -inkey rsa.pem -passin pass:123456 -out verify.txt
通过比较可以发现plain.txt和verify.txt文件是相同的。
创建CA并签发证书
rsa算法ca
- 制作CA密钥(该密钥包含公私钥对,查看时仅显示私钥)
openssl genrsa -out ca.key 2048
- 制作CA根证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.cer
- 创建客户端密钥
openssl genrsa -out client.key 2048
- 生成客户端证书请求文件
openssl req -new -key client.key -out client.csr
- 用CA给客户端签发证书
openssl x509 -req -sha256 -in client.csr -CA ca.cer -CAkey ca.key -CAcreateserial -days 3650 -out client.cer
ecc算法ca
查看你的openssl版本支持的椭圆曲线参数
openssl ecparam -list_curves
制作CA密钥(该密钥包含公私钥对,查看时仅显示私钥)
openssl ecparam -genkey -name secp256r1 -out ca.key
制作CA根证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.cer -subj "/CN=RootCA/OU=RootCA/O=RootCA"
创建客户端密钥
openssl ecparam -genkey -name secp256r1 -out client.key
生成客户端证书请求文件
openssl req -new -key client.key -out client.csr -subj "/CN=your.domain.com/OU=YourOU/O=YourOrganization"
用CA给客户端签发证书
openssl x509 -req -sha256 -days 3650 -in client.csr -CA ca.cer -CAkey ca.key -CAcreateserial -out client.cer
私钥转换为pkcs8格式
openssl pkcs8 -topk8 -nocrypt -in ca.key -out cap8.key