关于ssl:OpenSSL加解密使用

33次阅读

共计 8549 个字符,预计需要花费 22 分钟才能阅读完成。

本章解说下 openssl 相干概念和加解密算法的根本应用

这篇文章讲述以下几点

什么是 OpenSSL
基本功能
密钥、证书的编码格局和后缀名
对称加密的根本应用
生成公私钥对
非对称加密的根本应用

  1. 什么是 OpenSSL
    OpenSSL 是一个安全套接字层明码库,囊括次要的明码算法、罕用的密钥和证书封装治理性能及 SSL 协定,并提供丰盛的应用程序供测试或其它目标应用。
  2. 基本功能
    openssl 是一个开源程序的套件、这个套件有三个局部组成:一是 libcryto,这是一个具备通用性能的加密库,外面实现了泛滥的加密库;二是 libssl,这个是实现 ssl 机制的,它是用于实现 TLS/SSL 的性能;三是 openssl,是个多功能命令行工具,它能够实现加密解密,甚至还能够当 CA 来用,能够让你创立证书、撤消证书。

为了做个更简略的辨别,我分成上面 3 种,可能你看着会亲切一些

加解密库(本章只探讨加解密)
SSL 协定实现
一些通过封装,不便你应用加解密和 SSL 的工具
** 密钥、证书的编码格局和后缀名
目前有以下两种编码格局.

PEM – Privacy Enhanced Mail
关上看文本格式, 以 ”—–BEGIN—–“ 结尾, “—–END—–“ 结尾, 内容是 Base64 编码,查看 PEM 格局的信息能够用命令
openssl rsa -in my.pem -text -noout
Unix 服务器偏差于应用这种编码格局.
DER – Distinguished Encoding Rules
关上看是二进制格局, 不可读,查看 DER 格局的信息能够用命令
openssl rsa -in my.der -inform der -text -noout
Java 和 Windows 服务器偏差于应用这种编码格局.
咱们平时见到的多种后缀名,都是语义化的后缀,在生成密钥的时候,比方咱们私钥的后缀名能够写.pem .key,都是能够的,以下几种为罕用后缀

CRT – CRT 应该是 certificate 的三个字母, 其实还是证书的意思, 常见于 Unix 零碎, 有可能是 PEM 编码, 也有可能是 DER 编码, 大多数应该是 PEM 编码, 置信你曾经晓得怎么分别.

CER – 还是 certificate, 还是证书, 常见于 Windows 零碎, 同样的, 可能是 PEM 编码, 也可能是 DER 编码, 大多数应该是 DER 编码.

KEY – 通常用来寄存一个公钥或者私钥, 并非 X.509 证书, 编码同样的, 可能是 PEM, 也可能是 DER.
查看 KEY 的方法:
openssl rsa -in mykey.key -text -noout
如果是 DER 格局的话, 同理应该这样了:
openssl rsa -in mykey.key -text -noout -inform der

CSR – Certificate Signing Request, 即证书签名申请, 这个并不是证书, 而是向权威证书颁发机构取得签名证书的申请, 其核心内容是一个公钥(当然还附带了一些别的信息), 在生成这个申请的时候, 同时也会生成一个私钥, 私钥要本人保存好,查看的方法:
openssl req -noout -text -in my.csr
(如果是 DER 格局的话依旧加上 -inform der, 这里不写了)

  1. 罕用加解密算法应用
    咱们重点探讨如何应用

1. 对称加密

咱们须要用到 openssl enc 命令,先看下帮忙文档

$ openssl enc -h

:<<!
-in <file> 输出文件
-out <file> 输入文件
-pass <arg> 明码
-S 盐,用于加盐加密,请防止人为输出,上面探讨
-e encrypt 加密操作
-d decrypt 解密操作
-a/-base64 base64 encode/decode, depending on encryption flag 是否将后果 base64 编码
-k 已被 -pass 参数取代
-kfile 已被 -pass 参数取代
-md 指定密钥生成的摘要算法 默认 MD5
-K/-iv 加密所需的 key 和 iv 向量,由输出的 -pass 生成
-[pP] print the iv/key (then exit if -P) 是否须要在控制台输入生成的 key 和 iv 向量
-bufsize <n> 读写文件的 I / O 缓存,个别不须要指定
-engine e 指定三方加密设施,没有环境,暂不试验

Cipher Types 以下是局部算法,咱们能够抉择用哪种算法加密
-aes-128-cbc -aes-128-cbc-hmac-sha1 -aes-128-cfb
-aes-128-cfb1 -aes-128-cfb8 -aes-128-ctr
-aes-128-ecb -aes-128-gcm -aes-128-ofb
…………
!
应用,默认从控制台输出明码,如果不指定加密算法,是不会进行加密的,也不会报错,比方咱们不指定算法,只指定 base64 格局输入,就相当于只做了 base64 编码而已

/对文件进行 base64 编码 /
openssl enc -base64 -in plain.txt -out base64.txt
/ 对 base64 格式文件进行解密 /
openssl enc -base64 -d -in base64.txt -out plain2.txt
/ 应用 diff 命令查看可知解码前后明文一样 /
diff plain.txt plain2.txt
不同输出明码的形式

/命令行输出,明码 123456/
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456
/文件输出,明码 123456/
echo 123456 > passwd.txt
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass file:passwd.txt
/环境变量输出,明码 123456/
passwd=123456
export passwd
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass env:passwd
/从文件形容输出 /
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass fd:1
/ 从规范输出输出 /
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass stdin
对称加密的应用中,尽管咱们输出了 -pass,指定了明码,然而实质是采纳 key 和 iv 向量进行加密的,咱们输出的 -pass,会转换成 key 和 iv
为了加强安全性,在把用户明码转换成 key / iv 的时候须要应用盐值,默认盐值随机生成。应用 - S 参数,则盐值由用户指定。也可指用 -nosalt 指定不应用盐值,但升高了安全性,不举荐应用。
因为实质是采纳 key / iv 加密,所以咱们能够间接用 key / iv 解密或者加密
手动指定 Key 和 IV 值,指定 key / iv 后,-pass 参数不起作用

/手动指定 key 和 iv 值 /
$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -K 1223 -iv f123 -p
salt=0B00000000000000
key=12230000000000000000000000000000
iv =F1230000000000000000000000000000
/ 指定 pass 明码,不起作用,留神 Key 和 IV 值是 16 进制/
$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -K 1223 -iv f123 -p -pass pass:123456
salt=F502F4B8DE62E0E5
key=12230000000000000000000000000000
iv =F1230000000000000000000000000000
2. 公私钥对的生成(这里演示 RSA 算法相干)

首先咱们须要用到 openssl genrsa 命令,先看下帮忙文档,这是一个繁难的命令,为了不便咱们生成本人的私钥

$ openssl genrsa -h

/*
usage: genrsa [args] [numbits]

-des 生成的私钥采纳 DES 算法加密
-des3 生成的私钥采纳 DES3 算法加密 (168 bit key)
-seed encrypt PEM output with cbc seed
-aes128, -aes192, -aes256

以上几个都是对称加密算法的指定,因为咱们长期会把私钥加密,防止明文寄存

-out file 私钥输入地位
-passout arg 输入文件的明码,如果咱们指定了对称加密算法,也能够不带此参数,会有命令行提醒你输出明码
*/
咱们生成一个私钥

~ » openssl genrsa -out my.key -des3

/*
Generating RSA private key, 512 bit long modulus
…++++++++++++
.++++++++++++
e is 65537 (0x10001)

因为指定了 des3 算法,并且没指定明码,所以会要求我输出明码

Enter pass phrase for my.key:

Verifying – Enter pass phrase for my.key:

*/

~ » cat my.key

/*
—–BEGIN RSA PRIVATE KEY—–
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,21A9C0CD76DFBF27

i1h8ZmZxOZxDHigtXs0tAIWNs7THoN4t00F4xmYP7gDEU8vwWXltZisUqMJ2KHgZ
ME70Tm2XvhEAwu3OLhCaV6Url+DJ/G6sMFpnvkebrW51Ndph87ZCRdhaOrXN2WVg
+/KNRv2dMh4c98zgoJqYiN6qqdY9Sztj0DMtjn2f9k7mU8l2oN5bmlO6dy+mX2ZB
Qaupx9PV2DZH7Yd5tcKLudCa44lJ9cJscnvIyzLhDHcrGytCsTeHNeVMx9gefd0p
DzMBruiNhmXSe8a067OT5mWMi7++4WOYYWfIj2bat/pxsBNo0gOxqcuV0G1RFEDA
uX0vk1ma3+hB01p51bPCjc2HF/nvs2s/YeYgJR/E3zuxQGMvi6G0uxVY10i5xhtb
mIXi1J5RSoVcj2gMXD3GasGANNG3hdTWC+g6hfq+DczmGl8uR9lXwg==
—–END RSA PRIVATE KEY—–

*/
咱们能够指定私钥长度,命令最初就是指定私钥长度,默认 512bit

openssl genrsa -out my.key -des3 1024
另外咱们须要用到 openssl rsa 命令,咱们会用它生成公钥,先看下帮忙文档

$ openssl rsa -h

/*
-inform arg 输出文件编码格局,只有 pem 和 der 两种
-outform arg 输入文件编码格局,只有 pem 和 der 两种
-in arg input file 输出文件
-sgckey Use IIS SGC key format
-passin arg 如果输出文件被对称加密过,须要指定输出文件的明码
-out arg 输入文件地位
-passout arg 如果输入文件也须要被对称加密,须要指定输入文件的明码

-des 对输入后果采纳对称加密 des 算法
-des3 对输入后果采纳对称加密 des3 算法
-seed
-aes128, -aes192, -aes256

以上几个都是对称加密算法的指定,生成私钥的时候个别会用到,咱们不让私钥明文保留

-text 以明文模式输入各个参数值
-noout 不输入密钥到任何文件
-modulus 输入模数值
-check 查看输出密钥的正确性和一致性
-pubin 指定输出文件是公钥
-pubout 指定输入文件是公钥
-engine e 指定三方加密库或者硬件
*/
咱们利用方才生成的私钥 my.key,以此生成一个公钥

~ » openssl rsa -in my.key -pubout -out my_pub.key

/*
Enter pass phrase for my.key: # 因为私钥有明码,咱们须要输出

writing RSA key

*/

~ » cat my_pub.key

/*
—–BEGIN PUBLIC KEY—–
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAN4QWx/qPoOllcE8ZcR5zBzrSVFh7NXY
4SJHB8+IM3Wv2aYi7F3GlZjpt6EP3vdd4x4cJnuPFnZ5mZ5wFPQ8xD0CAwEAAQ==
—–END PUBLIC KEY—–
*/
openssl rsa 命令的性能还有很多

rsa 增加 和 去除 密钥的对称加密
/ 生成不加密的 RSA 密钥/
$ openssl genrsa -out RSA.pem

Generating RSA private key, 512 bit long modulus
…………..++++++++++++
…..++++++++++++
e is 65537 (0x10001)

/为 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

/比拟原始后的 RSA 密钥和去除口令后的 RSA 密钥,是一样/
$ diff RSA.pem P_RSA.pem
2、批改密钥的爱护口令和算法

/生成 RSA 密钥/
$ openssl genrsa -des3 -passout pass:123456 -out RSA.pem

Generating RSA private key, 512 bit long modulus
………………++++++++++++
………………….++++++++++++
e is 65537 (0x10001)

/批改加密算法为 aes128,口令是 123456/

$ openssl rsa -in RSA.pem -passin pass:123456 -aes128 -passout pass:123456 -out E_RSA.pem
3、查看密钥对中的各个参数

$ openssl rsa -in RSA.pem -des -passin pass:123456 -text -noout
4、提取密钥中的公钥并打印模数值

/提取公钥,用 pubout 参数指定输入为公钥/
$ openssl rsa -in RSA.pem -passin pass:123456 -pubout -out pub.pem

/打印公钥中模数值/
$ openssl rsa -in pub.pem -pubin -modulus -noout

Modulus=C35E0B54041D78466EAE7DE67C1DA4D26575BC1608CE6A199012E11D10ED36E2F7C651D4D8B40D93691D901E2CF4E21687E912B77DCCE069373A7F6585E946EF

5、转换密钥的格局

/把 pem 格局转化成 der 格局,应用 outform 指定 der 格局/
$ openssl rsa -in RSA.pem -passin pass:123456 -des -passout pass:123456 -outform der -out rsa.der

/把 der 格局转化成 pem 格局,应用 inform 指定 der 格局/
$ openssl rsa -in rsa.der -inform der -passin pass:123456 -out rsa.pem
3. 利用已有的公私钥对,进行非对称加解密

咱们这里须要用到 openssl rsautl 命令

留神:无论是应用公钥加密还是私钥加密,RSA 每次可能加密的数据长度不能超过 RSA 密钥长度,并且依据具体的补齐形式不同输出的加密数据最大长度也不一样,而输入长度则总是跟 RSA 密钥长度相等。RSA 不同的补齐办法对应的输出输出长度如下表

数据补齐形式 输出数据长度 输入数据长度 参数字符串
PKCS#1 v1.5 少于(密钥长度 -11) 字节 同密钥长度 -pkcs
PKCS#1 OAEP 少于 (密钥长度 -11) 字节 同密钥长度 -oaep
PKCS#1 for SSLv23 少于 (密钥长度 -11) 字节 同密钥长度 -ssl
不应用补齐 同密钥长度 同密钥长度 -raw
应用 rsautl 进行加密和解密操作,咱们还是先看一下帮忙文档

$ openssl rsautl -h
Usage: rsautl [options]
-in file input file // 输出文件
-out file output file // 输入文件
-inkey file input key // 输出的密钥
-keyform arg private key format – default PEM // 指定密钥格局
-pubin input is an RSA public // 指定输出的是 RSA 公钥
-certin input is a certificate carrying an RSA public key // 指定输出的是证书文件
-ssl use SSL v2 padding // 应用 SSLv23 的填充形式
-raw use no padding // 不进行填充
-pkcs use PKCS#1 v1.5 padding (default) // 应用 V1.5 的填充形式
-oaep use PKCS#1 OAEP // 应用 OAEP 的填充形式
-sign sign with private key // 应用私钥做签名
-verify verify with public key // 应用公钥认证签名
-encrypt encrypt with public key // 应用公钥加密
-decrypt decrypt with private key // 应用私钥解密
-hexdump hex dump output // 以 16 进制 dump 输入
-engine e use engine e, possibly a hardware device. // 指定三方库或者硬件设施
-passin arg pass phrase source // 指定输出的明码
openssl rsautl 根本的加解密应用

/生成 RSA 密钥/
$ openssl genrsa -des3 -passout pass:123456 -out RSA.pem

Generating RSA private key, 512 bit long modulus
…………++++++++++++
…++++++++++++
e is 65537 (0x10001)

/提取公钥/
$ openssl rsa -in RSA.pem -passin pass:123456 -pubout -out pub.pem

/应用 RSA 作为密钥进行加密,实际上应用其中的公钥进行加密/
$ openssl rsautl -encrypt -in plain.txt -inkey RSA.pem -passin pass:123456 -out enc.txt

/应用 RSA 作为密钥进行解密,实际上应用其中的私钥进行解密/
$ openssl rsautl -decrypt -in enc.txt -inkey RSA.pem -passin pass:123456 -out replain.txt

/比拟原始文件和解密后文件/
$ diff plain.txt replain.txt

/应用公钥进行加密/
$ openssl rsautl -encrypt -in plain.txt -inkey pub.pem -pubin -out enc1.txt

/私钥进行解密/
$ openssl rsautl -decrypt -in enc1.txt -inkey RSA.pem -passin pass:123456 -out replain1.txt

/比拟原始文件和解密后文件 /
$ diff plain.txt replain1.txt
签名与验证操作

/提取 PCKS8 格局的私钥/
$ openssl pkcs8 -topk8 -in RSA.pem -passin pass:123456 -out pri.pem -nocrypt

/应用 RSA 密钥进行签名,实际上应用私钥进行加密/
$ openssl rsautl -sign -in plain.txt -inkey RSA.pem -passin pass:123456 -out sign.txt

/应用 RSA 密钥进行验证,实际上应用公钥进行解密/
$ openssl rsautl -verify -in sign.txt -inkey RSA.pem -passin pass:123456 -out replain.txt

/比照原始文件和签名解密后的文件/
$ diff plain.txt replain.txt

/应用私钥进行签名/
$ openssl rsautl -sign -in plain.txt -inkey pri.pem -out sign1.txt

/应用公钥进行验证/
$ openssl rsautl -verify -in sign1.txt -inkey pub.pem -pubin -out replain1.txt

/比照原始文件和签名解密后的文件/
$ cat plain replain1.txt

参考链接:
https://sslhow.com/openssl-co…

正文完
 0