用途:
本指令能够使用RSA算法签名,验证身份,加密/解密数据。
用法:
openssl rsautl [-in file] [-out file] [-inkey file] [-passin arg] [-keyform PEM|DER|NET] [-pubin] [-certin] [-asn1parse] [-hexdump] [-raw] [-oaep] [-ssl] [-pkcs] [-x931] [-sign] [-verify][-encrypt] [-decrypt] [-rev] [-engine e]
选项说明:
-in filename:需要处理的文件,默认为标准输入。
-out filename:指定输出文件名,默认为标准输出。
-inkey file:指定我们的私有密钥文件,格式必须是RSA私有密钥文件。
-passin arg:指定私钥包含口令存放方式。比如用户将私钥的保护口令写入一个文件,采用此选项指定此文件,可以免去用户输入口令的操作。比如用户将口令写入文件“pwd.txt”,输入的参数为:-passin file:pwd.txt。
-keyform PEM|DER|NET:证书私钥的格式。
-pubin:表明我们输入的是一个公钥文件,默认输入为私钥文件。
-certin:表明我们输入的是一个证书文件。
-asn1parse:对输出的数据进行ASN1分析。该指令一般和-verify一起用的时候威力大。
-hexdump:用十六进制输出数据。
-pkcs、 -oaep、 -ssl、 -raw、-x931:采用的填充模式,上述四个值分别代表:PKCS#1.5(缺省值)、 PKCS#1 OAEP、 SSLv2、X931里面特定的填充模式,或者不填充。如果要签名,只有-pkcs和-raw可以使用。
-sign:给输入的数据签名。需要我们的私有密钥文件。
-verify:对输入的数据进行验证。
-encrypt:用我们的公共密钥对输入的数据进行加密。
-decrypt:用RSA的私有密钥对输入的数据进行解密。
-rev:数据是否倒序。
-engine e:硬件引擎。
注意:
Rsautl命令用RSA算法目录仅仅能够用于签名或验证小块的数据。
实例:
生成RSA密钥:
openssl genrsa -des3 -out prikey.pem
分离出公钥:
openssl genrsa -des3 -out prikey.pem
openssl rsa -in prikey.pem -pubout -out pubkey.pem
对文件签名:
openssl rsautl -sign -inkey prikey.pem -in a.txt -hexdump,文件a.txt的内容不能太长; openssl rsautl -sign -inkey prikey.pem -in a.txt -out sig.dat
验证签名:
openssl rsautl -verify -inkey prikey.pem -in sig.dat,验证成功后打印出a.txt的内容;
公钥加密:
openssl rsautl -encrypt -pubin -inkey pubkey.pem -in a.txt -out b.txt
私钥解密:
openssl rsautl -decrypt -inkey prikey.pem -in b.txt
用证书中的公钥加密:
openssl rsautl -encrypt -certin -inkey cert1.pem -in a.txt
用一个私钥对数据进行签名:
openssl rsautl -sign -in file -inkey key.pem -out sig
恢复签名数据:
openssl rsautl -verify -in sig -inkey key.pem
检查未处理的签名数据:
openssl rsautl -verify -in file -inkey key.pem -raw –hexdump
0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0020 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0030 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0040 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0050 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0060 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................
0070 - ff ff ff ff 00 68 65 6c-6c 6f 20 77 6f 72 6c 64 .....hello world
这个数据明显的是使用PKCS#1填充格式。如果这个执行完后,用加密或解密这个块,将会产生类型2(即2个字节)和随机的填充值来替代0xff字节。
可以使用这个命令结合B<asn1parse>来分析证书的签名值。考虑到certs/pca-cert.pem中的自签名的情况。运行B<asn1parse>,有下面的结果:
openssl asn1parse -in pca-cert.pem
0:d=0 hl=4 l= 742 cons: SEQUENCE
4:d=1 hl=4 l= 591 cons: SEQUENCE
8:d=2 hl=2 l= 3 cons: cont [ 0 ]
10:d=3 hl=2 l= 1 prim: INTEGER :02
13:d=2 hl=2 l= 1 prim: INTEGER :00
16:d=2 hl=2 l= 13 cons: SEQUENCE
18:d=3 hl=2 l= 9 prim: OBJECT :md5WithRSAEncryption
29:d=3 hl=2 l= 0 prim: NULL
31:d=2 hl=2 l= 92 cons: SEQUENCE
33:d=3 hl=2 l= 11 cons: SET
35:d=4 hl=2 l= 9 cons: SEQUENCE
37:d=5 hl=2 l= 3 prim: OBJECT :countryName
42:d=5 hl=2 l= 2 prim: PRINTABLESTRING :AU
....
599:d=1 hl=2 l= 13 cons: SEQUENCE
601:d=2 hl=2 l= 9 prim: OBJECT :md5WithRSAEncryption
612:d=2 hl=2 l= 0 prim: NULL
614:d=1 hl=3 l= 129 prim: BIT STRING
最终的BIT STRING包含了实际的签名数据。可以用下面的命令提取出来:
openssl asn1parse -in pca-cert.pem -out sig -noout -strparse 614
提出出证书公钥值的命令是:
openssl x509 -in test/testx509.pem -pubkey -noout >pubkey.pem
签名值提取:
openssl rsautl -in sig -verify -asn1parse -inkey pubkey.pem -pubin
0:d=0 hl=2 l= 32 cons: SEQUENCE
2:d=1 hl=2 l= 12 cons: SEQUENCE
4:d=2 hl=2 l= 8 prim: OBJECT :md5
14:d=2 hl=2 l= 0 prim: NULL
16:d=1 hl=2 l= 16 prim: OCTET STRING
0000 - f3 46 9e aa 1a 4a 73 c9-37 ea 93 00 48 25 08 b5 .F...Js.7...H%..
这是分析的ASN1摘要新结构。可以看见的是用MD5摘要的结果。实际的签名部分可以用下面命令提取出来:
openssl asn1parse -in pca-cert.pem -out tbs -noout -strparse 4
摘要值计算对比:
openssl md5 -c tbs
MD5(tbs)= f3:46:9e:aa:1a:4a:73:c9:37:ea:93:00:48:25:08:b5
摘要值可以由上面恢复的数据来看到。