欢迎来到魔幻小生的博客

OpenSSL的基本使用

前言

OpenSSL 是使用非常广泛的 SSL 的开源实现。由于其中实现了为 SSL 所用的各种加密算法,因此 OpenSSL 也是被广泛使用的加密函数库。下面介绍一下 OpenSSL 的一些常用命令。

image

对称加密指令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

image

解密使用错误的算法或者密码均会解密失败。使用-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

image

该密钥文件中包含公私钥对,查看rsa.pem文件时仅显示私钥

image

可以用如下指令导出公钥文件

openssl rsa -in rsa.pem -pubout -out pub.pem

image

未加密的密钥文件会产生安全问题,在生成密钥文件时,我们可以对密钥文件进行加密处理

openssl genrsa -out rsa1.pem -des -passout pass:123456 1024

image

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

image

去除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

image

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

  1. 制作CA密钥(该密钥包含公私钥对,查看时仅显示私钥)
openssl genrsa -out ca.key 2048
  1. 制作CA根证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.cer

image

  1. 创建客户端密钥
openssl genrsa -out client.key 2048
  1. 生成客户端证书请求文件
openssl req -new -key client.key -out client.csr

image

  1. 用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

image

制作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
posted @ 2022-06-17 11:03  魔幻小生  阅读(4299)  评论(0编辑  收藏  举报