openssl-rsautl
名称
openssl-rsautl - RSA 命令
语法
openssl rsautl [-help] [-in 文件] [-passin 参数] [-rev] [-out 文件] [-inkey 文件名|uri] [-keyform DER|PEM|P12|ENGINE] [-pubin] [-certin] [-sign] [-verify] [-encrypt] [-decrypt] [-pkcs] [-x931] [-oaep] [-raw] [-hexdump] [-asn1parse] [-engine id] [-rand 文件] [-writerand 文件] [-provider 名称] [-provider-path 路径] [-propquery propq]
描述
此命令已弃用。建议使用 openssl-pkeyutl(1) 命令。
此命令可用于使用 RSA 算法对数据进行签名、验证、加密和解密。
选项
- -help
-
打印用法信息。
- -in 文件名
-
指定要从中读取数据的输入文件名,如果未指定此选项,则为标准输入。
- -passin 参数
-
输出文件中使用的密码。请参阅 openssl-passphrase-options(1)。
- -rev
-
反转输入顺序。
- -out 文件名
-
指定要写入的输出文件名,默认为标准输出。
- -inkey 文件名|uri
-
输入密钥,默认情况下应为 RSA 私钥。
- -keyform DER|PEM|P12|ENGINE
-
密钥格式;默认为未指定。有关详细信息,请参阅 openssl-format-options(1)。
- -pubin
-
默认情况下,从密钥输入读取私钥。使用此选项时,将改为读取公钥。如果输入不包含公钥但包含私钥,则使用其公钥部分。
- -certin
-
输入是包含 RSA 公钥的证书。
- -sign
-
对输入数据进行签名并输出签名结果。这需要 RSA 私钥。
- -verify
-
验证输入数据并输出恢复的数据。
- -encrypt
-
使用 RSA 公钥加密输入数据。
- -decrypt
-
使用 RSA 私钥解密输入数据。
- -pkcs、-oaep、-x931、-raw
-
要使用的填充:PKCS#1 v1.5(默认)、PKCS#1 OAEP、ANSI X9.31 或无填充。对于签名,只能使用-pkcs 和 -raw。
注意:由于针对 Bleichenbacher 攻击的保护,在填充检查失败的情况下,使用 PKCS#1 v1.5 模式解密不会返回错误。使用-raw 并手动检查返回值以检查填充是否正确。
- -hexdump
-
十六进制转储输出数据。
- -asn1parse
-
解析 ASN.1 输出数据,这在与-verify 选项结合使用时非常有用。
- -engine id
-
请参阅 openssl(1) 中的“引擎选项”。此选项已弃用。
- -rand 文件、-writerand 文件
-
有关详细信息,请参阅 openssl(1) 中的“随机状态选项”。
- -provider 名称
- -provider-path 路径
- -propquery propq
注意
由于此命令直接使用 RSA 算法,因此它只能用于对少量数据进行签名或验证。
示例
等效于这些的示例可以在非弃用 openssl-pkeyutl(1) 命令的文档中找到。
使用私钥对一些数据进行签名
openssl rsautl -sign -in file -inkey key.pem -out sig
恢复签名数据
openssl rsautl -verify -in sig -inkey key.pem
检查原始签名数据
openssl rsautl -verify -in sig -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(第二个字节)并且会显示随机填充数据而不是 0xff 字节。
可以结合使用此命令和 openssl-asn1parse(1) 来分析证书的签名。考虑 certs/pca-cert.pem 中的自签名示例。按如下方式运行 openssl-asn1parse(1) 将产生
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 DigestInfo 结构的解析版本。可以看出使用的摘要是 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
可以看出它与上面恢复的值一致。
另请参阅
openssl(1)、openssl-pkeyutl(1)、openssl-dgst(1)、openssl-rsa(1)、openssl-genrsa(1)
历史
此命令在 OpenSSL 3.0 中已弃用。
-engine 选项在 OpenSSL 3.0 中已弃用。
版权
版权所有 2000-2023 OpenSSL 项目作者。保留所有权利。
根据 Apache 许可证 2.0(“许可证”)获得许可。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或 https://www.openssl.org/source/license.html 中获取副本。