使用OpenSSL进行签名和验证

使用OpenSSL进行签名和验证,openssl,rsa,sign,verify,Openssl,Rsa,Sign,Verify,我正在尝试使用OpenSSL完成签名和验证签名的基本练习。签署工作罚款 $ openssl pkeyutl -hexdump -sign -inkey id_rsa -in test.txt > test.sig Enter pass phrase for id_rsa: $ cat test.sig 0000 - 20 ab 34 00 ff 87 50 1e-de fb c9 3d 10 2f 7b fd .4...P....=./{. 0010 - 99 a1 61 e0 3d

我正在尝试使用OpenSSL完成签名和验证签名的基本练习。签署工作罚款

$ openssl pkeyutl -hexdump -sign -inkey id_rsa -in test.txt > test.sig
Enter pass phrase for id_rsa:
$ cat test.sig
0000 - 20 ab 34 00 ff 87 50 1e-de fb c9 3d 10 2f 7b fd    .4...P....=./{.
0010 - 99 a1 61 e0 3d 5f 93 82-63 e9 0a 6f 1a 22 4f 04   ..a.=_..c..o."O.
etc...
然而,当我尝试验证该签名时,我得到了一个错误

$ openssl pkeyutl -verify -pubin -inkey id_rsa.pub.pem -signature test.sig test.txt
unable to load Public Key
我尝试使用的公钥是PEM格式的转换SSH公钥:

-----BEGIN RSA PUBLIC KEY-----
MIICCAKCAf8wxsGr3b/rR/BsRqRMBaKPEGATYhSNaqnThcx9YdA7jHcj1dK7Utmo
nXZz7WwB0W1vzADZpzX96UUX5OIn1iByZ3ZQZpkO6YApMYxo/oHyiBYiCyEhbqKR
TydzmXFGYJ6UtLBFLD1eKfJokhiqdRa1kVMdAd6nBT5JiNb0ADO3VisyPwQZpqyB
Izbq1643JT2PC1BYk1cqqxyTnY/kAEEQvcQwrd0y7p29slRHC6g77HToWJLzNdAj
b2rjkRIfMzDx0LwmCuEqh+9XfVYQFJyrqXTrcgQlKBQhTSneSnn/9SpqYs4ziOIR
4djO9BbhGb/09LSb31NFy6S99rXsElI2aSaaGz5y6/6wyYq+zMxmiS//iCV/heNv
i3PH+D2hxOdz+VEvAJ77x4cMOn3ovVW73aWoBsNP8c9ISKt6MSXClljskA1WFcYJ
9UuBicQ/FGL2j96lzQ2NZZrYru0gAOkj3WUF/z5ORGC7iRvgOc89oqUxKNG+N/RN
jrMbCBAN8hOlJCW0e7/MoangYtBtZ52ZSIxYACRRfKTUlKdjsE9UVYrqBtTeVDGp
Igb+0kuBD61XF6IpnHEX0OZeArL7FY1trDJ85lUU09qNbnlnxNAY2Qo3cZiXSRBW
ROBUxz0OzF2Gvj30BEiY1rshH+XtM5ViQo1nK+YkBQcrCbwfnCFBAgMBAAE=
-----END RSA PUBLIC KEY-----
使用命令生成

ssh-keygen -f key.pub -e -m pem
根据我读到的关于这个问题的讨论和文档,这应该是可行的。但事实并非如此

有什么提示吗


编辑:我刚刚用OpenSSL生成的一对密钥而不是转换的SSH密钥尝试了相同的过程。这只是默默地失败,而不是产生错误(
openssl
给我
pkeyutl
使用信息,而不是验证签名)

编辑2:使用二进制签名(省略
-hextump
)对OpenSSL生成的密钥具有相同的效果。在转换的RSA密钥上,我得到

unable to load Public Key
Error initializing context
[snip usage output]

您提供了不存在的选项
-签名
。正确的是
-sigfile
。以下工作:

$ openssl pkeyutl -sign -inkey key.pem -in data.txt > test.sig
$ openssl pkeyutl -verify -pubin -inkey pubkey.pem -sigfile test.sig -in data.txt
Signature Verified Successfully

我猜之所以使用
-hextump
选项是因为您不想取出二进制文件?您可以使用
base64
将二进制sig编码为ascii:

openssl pkeyutl -sign -inkey id_rsa -in test.txt | base64 > test.sig
但是,当您验证这一点时,您必须将其转换回二进制文件中的某个临时文件:

cat test.sig | base64 -d > ~test.sig.bin
您的公钥文件是“rsa公钥格式”,您可以在标题行“BEGIN rsa public key”中看到。您可以将其转换为非rsa公钥格式,其标题为“BEGIN public key”:

openssl rsa -in id_rsa.pub.pem -RSAPublicKey > id.pub.pem
最后,使用“公钥”pem和二进制SIG文件,您可以验证:

openssl pkeyutl -verify -pubin -inkey id.pub.pem -sigfile ~test.sig.bin -in test.txt
输出:

Signature Verified Successfully

您使用的OpenSSL的实现/版本是什么?@notfed-对不起,应该提到。openssl 1.0.1c-3,直截了当的。看起来您正在将签名的hextump输出到一个文件,并使用它进行验证。我怀疑openssl是否希望它读取hexdump而不是二进制签名。生成签名时是否可以尝试删除“-hextump”选项。@RaymondTau-尝试并添加了注释。恐怕没有解决这个问题。