文章目录
一、RSA
非对称加密算法
- 虽然非对称加密很安全,但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。
私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。
- 非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
- 比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人:银行才能对你的消息解密。
- 与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。
常见的非对称加密算法:
- RSA:RSA 是目前应用最广泛的数字加密和签名技术,比如国内的支付宝就是通过RSA算法来进行签名验证。它的安全程度取决于秘钥的长度,目前主流可选秘钥长度为 1024位、2048位、4096位等,理论上秘钥越长越难于破解。不过目前看 2048 位的秘钥已经足够安全了,支付宝的官方文档上推荐也是2048位。
- DSA:既 Digital Signature Algorithm,数字签名算法,和 RSA 不同的是,DSA 仅能用于数字签名,不能进行数据加密解密,其安全性和RSA相当,但其性能要比RSA快。
- ECDSA:相比于RSA算法,ECC 可以使用更小的秘钥,更高的效率,提供更高的安全保障,据称256位的ECC秘钥的安全性等同于3072位的RSA秘钥,和普通DSA相比,ECDSA在计算秘钥的过程中,部分因子使用了椭圆曲线算法。
公开密钥与私有密钥是一对
- 如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密
- 如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
- 因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
二、AES
对称加密算法
- 最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),这种方法在密码学中叫做对称加密算法。
- 对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。
优点:
- 对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。
- 密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。
缺点:
- 对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。
- 在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。
三、客户端加密过程
步骤:
1.客户端:随机产生AES的密钥
2.客户端:对身份证信息(重要信息)进行AES加密
3.客户端:通过使用RSA对AES密钥进行公钥加密
4.服务端:对加密后的AES密钥进行RSA私钥解密,拿到密钥原文;
5.服务端:对加密后的重要信息进行AES解密,拿到原始内容。
eg:
- 客户端传输重要信息给服务端,服务端返回的信息不需加密的情况
客户端传输重要信息给服务端,服务端返回的信息不需加密,例如绑定银行卡的时候,需要传递用户的银行卡号,手机号等重要信息,客户端这边就需要对这些重要信息进行加密,使用RSA公钥加密,服务端使用RSA解密,然后返回一些普通信息,比如状态码code,提示信息msg,提示操作是成功还是失败。这种场景下,仅仅使用RSA加密是可以的。
2.客户端传输重要信息给服务端,服务端返回的信息需加密的情况
客户端传输重要信息给服务端,服务端返回的信息需加密,例如客户端登录的时候,传递用户名和密码等资料,需要进行加密,服务端验证登录信息后,返回令牌token需要进行加密,客户端解密后保存。此时就需要结合这两种算法了。
三、RSA签名的PSS模式
PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充模式。
- 目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1 v1.5。相对应PKCS(Public Key Cryptography Standards)是一种能够自我从签名,而PSS无法从签名中恢恢复原来的签名。
- openssl-1.1.x以后默认使用更安全的PSS的RSA签名模式。
RSA算法比较慢,一般private key用来进行签名和public key用来进行验证
RSA加密算法引入padding机制的原因:
- 因RSA算法沒有加入乱数,当出现重复性的原始资料,攻击者会通过相同加密密文而猜测出原文,因此导入padding的机制來加強安全性。
- TLS流程中的密钥材料若不进行填充而直接加密,那么显然相同的key,会得到相同的密文。这种在语义上来说,是不安全的。
四、RSA加密、解密、签名、验签实际操作
说明:测试RSA加密解密(encrypt、decrypt)和签名验证(sign,verify)
文件:
- rsa_private.key:私钥
- rsa_public.key:公钥
- data: 明文
- endata: 密文
- sign: 签名
- de_sign: 解签名
默认情况下,openssl 输出格式为 PKCS#1-PEM(RSA加密的两种算法分别是RSAES-PKCS-v1_5 and RSAES-OAEP。)
1.生成RSA私钥(无加密)
openssl genrsa -out rsa_private.key 2048
生成RSA公钥
openssl rsa -in rsa_private.key -pubout -out rsa_public.key
2.原始数据
echo "wangji is a goog boy" > ./data
3.加密和解密
用公钥进行加密:
openssl rsautl -pubin -inkey ./rsa_public.key -in ./data -encrypt -out ./endata
用户私钥进行解密:
wangji@script-wang:/tmp/test$ openssl rsautl -inkey ./rsa_private.key -in ./endata -decrypt
wangji is a goog boy
openssl加解密大文件见:怎样使用openssl加解密大文件
4.签名和验证(sign, verify)
签名过程包括hash和加密。hash函数一般使用sha1。这样输入明文,直接生成sign签名。
如果是私钥签名所做的事就是先hash再加密,选择一种hash算法把原始消息计算后成ASN1格式,再把这个资料用private key加密后送出,资料本身不加密,这种方式主要是用來验证资料来源是否可信任的,送出时把原始资料和签名一起送出。
私钥签名,输出格式为ASN1格式
openssl sha1 -sign ./rsa_private.key ./data > ./sign
公钥验签,使用ASN1解开签名文件de_sign
wangji@script-wang:/tmp/test$ openssl rsautl -pubin -inkey ./rsa_public.key -in sign -verify -out ./de_sign
wangji@script-wang:/tmp/test$ openssl asn1parse -inform der -in ./de_sign
0:d=0 hl=2 l= 33 cons: SEQUENCE
2:d=1 hl=2 l= 9 cons: SEQUENCE
4:d=2 hl=2 l= 5 prim: OBJECT :sha1
11:d=2 hl=2 l= 0 prim: NULL
13:d=1 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:2E40F194522192093EE96F72A1A4EFB6DEC80C7C
用public key解开签名文件sign
,使用ASN1解开签名
wangji@script-wang:/tmp/test$ openssl rsautl -pubin -inkey ./rsa_public.key -in ./sign -verify -asn1parse
0:d=0 hl=2 l= 33 cons: SEQUENCE
2:d=1 hl=2 l= 9 cons: SEQUENCE
4:d=2 hl=2 l= 5 prim: OBJECT :sha1
11:d=2 hl=2 l= 0 prim: NULL
13:d=1 hl=2 l= 20 prim: OCTET STRING
0000 - 2e 40 f1 94 52 21 92 09-3e e9 6f 72 a1 a4 ef b6 .@..R!..>.or....
0010 - de c8 0c 7c ...|
用public key解开签名文件sign
,并且保留padding:
wangji@script-wang:/tmp/test$ openssl rsautl -pubin -inkey ./rsa_public.key -in ./sign -raw -hexdump
...
01d0 - ff ff ff ff ff ff ff ff-ff ff ff ff 00 30 21 30 .............0!0
01e0 - 09 06 05 2b 0e 03 02 1a-05 00 04 14 2e 40 f1 94 ...+.........@..
01f0 - 52 21 92 09 3e e9 6f 72-a1 a4 ef b6 de c8 0c 7c R!..>.or.......|
和本地sha1对比
wangji@script-wang:/tmp/test$ openssl sha1 ./data
SHA1(./data)= 2e40f194522192093ee96f72a1a4efb6dec80c7c
如果两者hash结果是一样,那么确定签名送过来是正确的。
五、openssl 工具
1. openssl rsautl工具支持的填充模式
openssl rsautl --help,可以看到支持的padding模式有
-ssl Use SSL v2 padding
-raw Use no padding
-pkcs Use PKCS#1 v1.5 padding (default)
-oaep Use PKCS#1 OAEP
2.PSS填充模式的特点
PSS是RSA的填充模式中的一种。
完整的RSA的填充模式包括:
RSA_SSLV23_PADDING(SSLv23填充)
RSA_NO_PADDING(不填充)
RSA_PKCS1_OAEP_PADDING (RSAES-OAEP填充,强制使用SHA1,加密使用)
RSA_X931_PADDING(X9.31填充,签名使用)
RSA_PKCS1_PSS_PADDING(RSASSA-PSS填充,签名使用)
RSA_PKCS1_PADDING(RSAES-PKCS1-v1_5/RSASSA-PKCS1-v1_5填充,签名可使用)
其中主流的填充模式是PKCS1和PSS模式
PSS的优缺点如下:
- PKCS#1 v1.5比较简易实现,但是缺少security proof。
- PSS更安全,所以新版的openssl-1.1.x优先使用PSS进行私钥签名(具体在ssl握手的server key exchange阶段)
3.openssl 命令参考
1. openssl list-standard-commands(标准命令)
1) asn1parse: asn1parse用于解释用ANS.1语法书写的语句(ASN一般用于定义语法的构成)
2) ca: ca用于CA的管理
openssl ca [options]:
2.1) -selfsign
使用对证书请求进行签名的密钥对来签发证书。即"自签名",这种情况发生在生成证书的客户端、签发证书的CA都是同一台机器(也是我们大多数实验中的情况),我们可以使用同一个
密钥对来进行"自签名"
2.2) -in file
需要进行处理的PEM格式的证书
2.3) -out file
处理结束后输出的证书文件
2.4) -cert file
用于签发的根CA证书
2.5) -days arg
指定签发的证书的有效时间
2.6) -keyfile arg
CA的私钥证书文件
2.7) -keyform arg
CA的根私钥证书文件格式:
2.7.1) PEM
2.7.2) ENGINE
2.8) -key arg
CA的根私钥证书文件的解密密码(如果加密了的话)
2.9) -config file
配置文件
example1: 利用CA证书签署请求证书
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
3) req: X.509证书签发请求(CSR)管理
openssl req [options] <infile >outfile
3.1) -inform arg
输入文件格式
3.1.1) DER
3.1.2) PEM
3.2) -outform arg
输出文件格式
3.2.1) DER
3.2.2) PEM
3.3) -in arg
待处理文件
3.4) -out arg
待输出文件
3.5) -passin
用于签名待生成的请求证书的私钥文件的解密密码
3.6) -key file
用于签名待生成的请求证书的私钥文件
3.7) -keyform arg
3.7.1) DER
3.7.2) NET
3.7.3) PEM
3.8) -new
新的请求
3.9) -x509
输出一个X509格式的证书
3.10) -days
X509证书的有效时间
3.11) -newkey rsa:bits
生成一个bits长度的RSA私钥文件,用于签发
3.12) -[digest]
HASH算法
3.12.1) md5
3.12.2) sha1
3.12.3) md2
3.12.4) mdc2
3.12.5) md4
3.13) -config file
指定openssl配置文件
3.14) -text: text显示格式
example1: 利用CA的RSA密钥创建一个自签署的CA证书(X.509结构)
openssl req -new -x509 -days 3650 -key server.key -out ca.crt
example2: 用server.key生成证书签署请求CSR(这个CSR用于之外发送待CA中心等待签发)
openssl req -new -key server.key -out server.csr
example3: 查看CSR的细节
openssl req -noout -text -in server.csr
4) genrsa: 生成RSA参数
openssl genrsa [args] [numbits]
[args]
4.1) 对生成的私钥文件是否要使用加密算法进行对称加密:
4.1.1) -des: CBC模式的DES加密
4.1.2) -des3: CBC模式的DES加密
4.1.3) -aes128: CBC模式的AES128加密
4.1.4) -aes192: CBC模式的AES192加密
4.1.5) -aes256: CBC模式的AES256加密
4.2) -passout arg: arg为对称加密(des、des、aes)的密码(使用这个参数就省去了console交互提示输入密码的环节)
4.3) -out file: 输出证书私钥文件
[numbits]: 密钥长度
example: 生成一个1024位的RSA私钥,并用DES加密(密码为1111),保存为server.key文件
openssl genrsa -out server.key -passout pass:1111 -des3 1024
5) rsa: RSA数据管理
openssl rsa [options] <infile >outfile
5.1) -inform arg
输入密钥文件格式:
5.1.1) DER(ASN1)
5.1.2) NET
5.1.3) PEM(base64编码格式)
5.2) -outform arg
输出密钥文件格式
5.2.1) DER
5.2.2) NET
5.2.3) PEM
5.3) -in arg
待处理密钥文件
5.4) -passin arg
输入这个加密密钥文件的解密密钥(如果在生成这个密钥文件的时候,选择了加密算法了的话)
5.5) -out arg
待输出密钥文件
5.6) -passout arg
如果希望输出的密钥文件继续使用加密算法的话则指定密码
5.7) -des: CBC模式的DES加密
5.8) -des3: CBC模式的DES加密
5.9) -aes128: CBC模式的AES128加密
5.10) -aes192: CBC模式的AES192加密
5.11) -aes256: CBC模式的AES256加密
5.12) -text: 以text形式打印密钥key数据
5.13) -noout: 不打印密钥key数据
5.14) -pubin: 检查待处理文件是否为公钥文件
5.15) -pubout: 输出公钥文件
example1: 对私钥文件进行解密
openssl rsa -in server.key -passin pass:111 -out server_nopass.key
example:2: 利用私钥文件生成对应的公钥文件
openssl rsa -in server.key -passin pass:111 -pubout -out server_public.key
6) x509:
本指令是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换其格式,给CSR签名等X.509证书的管理工作
openssl x509 [args]
6.1) -inform arg
待处理X509证书文件格式
6.1.1) DER
6.1.2) NET
6.1.3) PEM
6.2) -outform arg
待输出X509证书文件格式
6.2.1) DER
6.2.2) NET
6.2.3) PEM
6.3) -in arg
待处理X509证书文件
6.4) -out arg
待输出X509证书文件
6.5) -req
表明输入文件是一个"请求签发证书文件(CSR)",等待进行签发
6.6) -days arg
表明将要签发的证书的有效时间
6.7) -CA arg
指定用于签发请求证书的根CA证书
6.8) -CAform arg
根CA证书格式(默认是PEM)
6.9) -CAkey arg
指定用于签发请求证书的CA私钥证书文件,如果这个option没有参数输入,那么缺省认为私有密钥在CA证书文件里有
6.10) -CAkeyform arg
指定根CA私钥证书文件格式(默认为PEM格式)
6.11) -CAserial arg
指定序列号文件(serial number file)
6.12) -CAcreateserial
如果序列号文件(serial number file)没有指定,则自动创建它
example1: 转换DER证书为PEM格式
openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
example2: 使用根CA证书对"请求签发证书"进行签发,生成x509格式证书
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
example3: 打印出证书的内容
openssl x509 -in server.crt -noout -text
7) crl: crl是用于管理CRL列表
openssl crl [args]
7.1) -inform arg
输入文件的格式
7.1.1) DER(DER编码的CRL对象)
7.1.2) PEM(默认的格式)(base64编码的CRL对象)
7.2) -outform arg
指定文件的输出格式
7.2.1) DER(DER编码的CRL对象)
7.2.2) PEM(默认的格式)(base64编码的CRL对象)
7.3) -text:
以文本格式来打印CRL信息值。
7.4) -in filename
指定的输入文件名。默认为标准输入。
7.5) -out filename
指定的输出文件名。默认为标准输出。
7.6) -hash
输出颁发者信息值的哈希值。这一项可用于在文件中根据颁发者信息值的哈希值来查询CRL对象。
7.7) -fingerprint
打印CRL对象的标识。
7.8) -issuer
输出颁发者的信息值。
7.9) -lastupdate
输出上一次更新的时间。
7.10) -nextupdate
打印出下一次更新的时间。
7.11) -CAfile file
指定CA文件,用来验证该CRL对象是否合法。
7.12) -verify
是否验证证书。
example1: 输出CRL文件,包括(颁发者信息HASH值、上一次更新的时间、下一次更新的时间)
openssl crl -in crl.crl -text -issuer -hash -lastupdate –nextupdate
example2: 将PEM格式的CRL文件转换为DER格式
openssl crl -in crl.pem -outform DER -out crl.der
8) crl2pkcs7: 用于CRL和PKCS#7之间的转换
openssl crl2pkcs7 [options] <infile >outfile
转换pem到spc
openssl crl2pkcs7 -nocrl -certfile venus.pem -outform DER -out venus.spc
https://www.openssl.org/docs/apps/crl2pkcs7.html
9) pkcs12: PKCS#12数据的管理
pkcs12文件工具,能生成和分析pkcs12文件。PKCS#12文件可以被用于多个项目,例如包含Netscape、 MSIE 和 MS Outlook
openssl pkcs12 [options]
http://blog.csdn.net/as3luyuan123/article/details/16105475
https://www.openssl.org/docs/apps/pkcs12.html
10) pkcs7: PCKS#7数据的管理
用于处理DER或者PEM格式的pkcs#7文件
openssl pkcs7 [options] <infile >outfile
http://blog.csdn.net/as3luyuan123/article/details/16105407
https://www.openssl.org/docs/apps/pkcs7.html
2. openssl list-message-digest-commands(消息摘要命令)
1) dgst: dgst用于计算消息摘要
openssl dgst [args]
1.1) -hex
以16进制形式输出摘要
1.2) -binary
以二进制形式输出摘要
1.3) -sign file
以私钥文件对生成的摘要进行签名
1.4) -verify file
使用公钥文件对私钥签名过的摘要文件进行验证
1.5) -prverify file
以私钥文件对公钥签名过的摘要文件进行验证
verify a signature using private key in file
1.6) 加密处理
1.6.1) -md5: MD5
1.6.2) -md4: MD4
1.6.3) -sha1: SHA1
1.6.4) -ripemd160
example1: 用SHA1算法计算文件file.txt的哈西值,输出到stdout
openssl dgst -sha1 file.txt
example2: 用dss1算法验证file.txt的数字签名dsasign.bin,验证的private key为DSA算法产生的文件dsakey.pem
openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt
2) sha1: 用于进行RSA处理
openssl sha1 [args]
2.1) -sign file
用于RSA算法的私钥文件
2.2) -out file
输出文件爱你
2.3) -hex
以16进制形式输出
2.4) -binary
以二进制形式输出
example1: 用SHA1算法计算文件file.txt的HASH值,输出到文件digest.txt
openssl sha1 -out digest.txt file.txt
example2: 用sha1算法为文件file.txt签名,输出到文件rsasign.bin,签名的private key为RSA算法产生的文件rsaprivate.pem
openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt
3. openssl list-cipher-commands (Cipher命令的列表)
1) aes-128-cbc
2) aes-128-ecb
3) aes-192-cbc
4) aes-192-ecb
5) aes-256-cbc
6) aes-256-ecb
7) base64
8) bf
9) bf-cbc
10) bf-cfb
11) bf-ecb
12) bf-ofb
13) cast
14) cast-cbc
15) cast5-cbc
16) cast5-cfb
17) cast5-ecb
18) cast5-ofb
19) des
20) des-cbc
21) des-cfb
22) des-ecb
23) des-ede
24) des-ede-cbc
25) des-ede-cfb
26) des-ede-ofb
27) des-ede3
28) des-ede3-cbc
29) des-ede3-cfb
30) des-ede3-ofb
31) des-ofb
32) des3
33) desx
34) rc2
35) rc2-40-cbc
36) rc2-64-cbc
37) rc2-cbc
38) rc2-cfb
39) rc2-ecb
40) rc2-ofb
41) rc4
42) rc4-40
六、SSL证书格式
1 DER,CER格式
.DER .CER,文件是二进制格式,只保存证书,不保存私钥。
- 该格式是二进制文件内容,Java 和 Windows 服务器偏向于使用这种编码格式。
OpenSSL 查看
openssl x509 -in certificate.der -inform der -text -noout
转换为 PEM:
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
2 PEM
.PEM,一般是文本格式,可保存证书,可保存私钥。
Privacy Enhanced Mail,一般为文本格式,以 -----BEGIN… 开头,以 -----END… 结尾。
- 中间的内容是 BASE64 编码。
- 这种格式可以保存证书和私钥,有时我们也把PEM 格式的私钥的后缀改为 .key 以区别证书与私钥。具体你可以看文件的内容。
openssl x509 -in certificate.pem -text -noout
转换为 DER:
openssl x509 -in certificate.pem -outform der -out cert.der
3 CRT
.CRT,可以是二进制格式,可以是文本格式,与 .DER 格式相同,不保存私钥。
Certificate 的简称,有可能是 PEM 编码格式,也有可能是 DER 编码格式。如何查看请参考前两种格式。
4 PFX
.PFX .P12,二进制格式,同时包含证书和私钥,一般有密码保护。
Predecessor of PKCS#12,这种格式是二进制格式,且证书和私钥存在一个 PFX 文件中。
- 一般用于 Windows 上的 IIS 服务器。
- 该格式的文件一般会有一个密码用于保证私钥的安全。
OpenSSL 查看:
openssl pkcs12 -in for-iis.pfx
转换为 PEM:
openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes
5 JKS
.JKS,二进制格式,同时包含证书和私钥,一般有密码保护。
Java Key Storage,很容易知道这是 JAVA 的专属格式,利用 JAVA 的一个叫 keytool 的工具可以进行格式转换。一般用于 Tomcat 服务器。
七、RSA密钥操作
默认情况下,openssl 输出格式为 PKCS#1-PEM
1.生成RSA密钥对
默认情况下,openssl 输出格式为 PKCS#1-PEM
生成RSA私钥(无加密)
openssl genrsa -out rsa_private.key 2048
生成RSA公钥
openssl rsa -in rsa_private.key -pubout -out rsa_public.key
2.使用AES256加密的RSA密钥对
生成RSA私钥(使用aes256加密)
- 其中 passout 代替shell 进行密码输入,否则会提示输入密码;
openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048
此时若生成公钥,需要提供密码
- 其中 passout 代替shell 进行密码输入,否则会提示输入密码;
openssl rsa -in rsa_aes_private.key -passin pass:111111 -pubout -out rsa_public.key
八、转换命令
1.加密和非加密私钥转换
加密的私钥转非加密
openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_private.key
非加密的私钥转加密
openssl rsa -in rsa_private.key -aes256 -passout pass:111111 -out rsa_aes_private.key
2. 私钥PEM转DER
私钥PEM转DER
- -inform和-outform 参数制定输入输出格式,由der转pem格式同理
openssl rsa -in rsa_private.key -outform der -out rsa_aes_private.der
查看私钥明细
openssl rsa -in rsa_private.key -noout -text
查看公钥明细
openssl rsa -in rsa_public.key -noout -text -pubin
3. 私钥PKCS#1转PKCS#8
私钥PKCS#1转PKCS#8
openssl pkcs8 -topk8 -in rsa_private.key -passout pass:111111 -out pkcs8_private.key
- 其中-passout指定了密码,输出的pkcs8格式密钥为加密形式,pkcs8默认采用des3 加密算法,内容如下:
-----BEGIN ENCRYPTED PRIVATE KEY-----
Base64 Encoded Data
-----END ENCRYPTED PRIVATE KEY-----
- 使用-nocrypt参数可以输出无加密的pkcs8密钥,如下:
-----BEGIN PRIVATE KEY-----
Base64 Encoded Data
-----END PRIVATE KEY-----
九、生成CA自签名证书
1.生成 RSA 私钥和自签名证书
- req是证书请求的子命令,
- -newkey rsa:2048 -keyout private_key.pem 表示生成私钥(PKCS8格式),
- -nodes 表示私钥不加密,若不带该参数将提示输入密码;
- -x509表示输出证书,-days365 为有效期,此后根据提示输入证书拥有者信息;
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt
若执行自动输入,可使用-subj选项:
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"
使用 已有RSA 私钥生成自签名证书
- -new 指生成证书请求,加上-x509 表示直接输出证书,-key 指定私钥文件,其余选项与上述命令相同
openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt
或者
openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"
wangji@script-wang:/tmp/test4$ file -b *
PEM certificate
ASCII text
或者
wangji@script-wang:/tmp/test4$ openssl genrsa -out ca.key 1024
wangji@script-wang:/tmp/test4$ openssl req -new -x509 -days 365 -key ca.key -out ca.cr -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"
wangji@script-wang:/tmp/test4$ ls
ca.cr ca.key
wangji@script-wang:/tmp/test4$ file -b *
PEM certificate
PEM RSA private key
十、生成CA签名请求及CA 签名
使用 RSA私钥生成 CSR 签名请求
openssl genrsa -aes256 -passout pass:111111 -out server.key 2048
此后输入密码、server证书信息完成,也可以命令行指定各类参数
openssl req -new -key server.key -out server.csr
或者
openssl req -new -key server.key -passin pass:111111 -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"
此时生成的 csr签名请求文件可提交至 CA进行签发
查看CSR 的细节
cat server.csr
-----BEGIN CERTIFICATE REQUEST-----
Base64EncodedData
-----END CERTIFICATE REQUEST-----
wangji@script-wang:/tmp/test4$ file -b server.*
PEM certificate request
PEM RSA private key
使用 CA 证书及CA密钥 对请求签发证书进行签发,生成 x509证书
- 其中 CAxxx 选项用于指定CA 参数输入
//生成RSA私有密钥
wangji@script-wang:/tmp/test4$ openssl genrsa -out rsa_private.key 2048
//使用 已有RSA 私钥生成自CA签名证书 cert.crt
wangji@script-wang:/tmp/test4$ openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"
//使用 已有的RSA私钥生成 CSR 签名请求
wangji@script-wang:/tmp/test4$ openssl req -new -key ./rsa_private.key -passin pass:111111 -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/[email protected]"
//使用 CA 证书及CA密钥 对请求签发证书进行签发,生成 x509证书
wangji@script-wang:/tmp/test4$ openssl x509 -req -days 3650 -in server.csr -CA cert.crt -CAkey rsa_private.key -passin pass:111111 -CAcreateserial -out server.crt
wangji@script-wang:/tmp/test4$ ll
total 428
drwxr-xr-x 2 wangji wangji 4096 May 23 15:53 ./
drwxrwxrwx 2569 root root 409600 May 23 15:13 ../
-rw-r--r-- 1 wangji wangji 1375 May 23 15:48 cert.crt
-rw------- 1 wangji wangji 1679 May 23 15:48 rsa_private.key
-rw-r--r-- 1 wangji wangji 1253 May 23 15:53 server.crt
-rw-r--r-- 1 wangji wangji 1021 May 23 15:52 server.csr
wangji@script-wang:/tmp/test4$ file -b *
PEM certificate
ASCII text
PEM RSA private key
PEM certificate
PEM certificate request
十一、证书查看及转换
查看证书细节
openssl x509 -in cert.crt -noout -text
转换证书编码格式
openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
合成 pkcs#12 证书(含私钥)
将 pem 证书和私钥转 pkcs#12 证书
openssl pkcs12 -export -in server.crt -inkey rsa_private.key -passin pass:111111 -password pass:111111 -out server.p12
- 其中-export指导出pkcs#12 证书,
- -inkey 指定了私钥文件,
- -passin 为私钥(文件)密码(nodes为无加密),
- -password 指定 p12文件的密码(导入导出)
将 pem 证书和私钥/CA 证书 合成pkcs#12 证书
wangji@script-wang:/tmp/test4$ openssl pkcs12 -export -in server.crt -inkey rsa_private.key -passin pass:111111 -chain -CAfile server.crt -password pass:111111 -out server-all.p12
其中:
- -chain指示同时添加证书链,
- -CAfile 指定了CA证书,
- 导出的p12文件将包含多个证书。
- (其他选项:-name可用于指定server证书别名;-caname用于指定ca证书别名)
pcks#12 提取PEM文件(含私钥)
openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -out out/server.pem
- 其中-password 指定 p12文件的密码(导入导出),
- -passout指输出私钥的加密密码(nodes为无加密)
- 导出的文件为pem格式,同时包含证书和私钥(pkcs#8):
仅提取私钥
wangji@script-wang:/tmp/test4$ openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -nocerts -out out/key.pem
仅提取证书(所有证书)
wangji@script-wang:/tmp/test4$ openssl pkcs12 -in server.p12 -password pass:111111 -nokeys -out out/key.pem
仅提取ca证书
openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -cacerts -out out/cacert.pem
仅提取server证书
openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -clcerts -out out/cert.pem
十二、查看证书信息
查看证书中的公钥信息:
openssl x509 -in ./cert.crt -pubkey
查看证书信息:
wangji@script-wang:/tmp/test4$ openssl x509 -in server.crt -noout -text
查看key信息:
wangji@script-wang:/tmp/test4$ openssl rsa -noout -text -in rsa_private.key
查看csr信息:
wangji@script-wang:/tmp/test4$ openssl req -noout -text -in server.csr
验证公钥和私钥是否匹配
wangji@script-wang:/tmp/test4$ diff -eq <(openssl x509 -pubkey -noout -in cert.crt) <(openssl rsa -pubout -in ./rsa_private.key)
writing RSA key
wangji@script-wang:/tmp/test4$ diff -eq <(openssl x509 -pubkey -noout -in server.crt) <(openssl rsa -pubout -in ./rsa_private.key)
writing RSA key
其他命令:
链接远程服务器:openssl s_client -connect www.google.com.hk:443
模拟https服务器
openssl s_server -accept 10086 -cert server.crt -key rsa_private.key -www
模拟client
openssl s_client -host 127.0.0.1 -port 10086 -showcerts -msg -state -tls1_2 -cert cert.crt -key rsa_private.key -CAfile server.crt
不同格式的证书转换
PEM转换为DER: openssl x509 -outform der -in myserver.crt -out myserver.der
DER转换为PEM:openssl x509 -inform der -in myserver.cer -out myserver.pem
PEM转换为PKCS:openssl pkcs12 -export -out myserver.pfx -inkey myserver.key -in myserver.crt -certfile ca.crt
PKCS转换为PEM: openssl pkcs12 -in myserver.pfx -out myserver2.pem -nodes
参考:
RSA AES-对称加密和非对称加密;
常见非对称加密算法;
RSA签名的PSS模式;
使用 openssl 生成证书;
SSL 证书格式普及,PEM、CER、JKS、PKCS12;
6.openssl解析证书常用命令;
【一】生成CA根证书、公钥、私钥指令(数字证书);
一文搞懂X509证书PEM DER CRT CER的区别;
6.openssl解析证书常用命令