2012-06-14 159 views
1

我正在尝试使用OpenSSL进行签名和验证签名的基本练习。签名工作正常使用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公共密钥:基于讨论和文件的命令

ssh-keygen -f key.pub -e -m pem 

产生

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

我已经读过关于这个问题,那应该工作。但事实并非如此。

任何提示?


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

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

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

执行什么/ OpenSSL的版本是您使用? –

+0

@notfed - 对不起,应该提到。 openssl 1.0.1c-3,直接从[Debian Wheezy repos](http://packages.debian.org/wheezy/openssl)。 – Inaimathi

+1

看来你正在将签名的hexdump输出到一个文件并用于验证。我怀疑openssl是否希望它读取hexdump而不是二进制签名。您可以在生成签名时尝试删除“-hexdump”选项。 –

回答

1

您给出了不存在的选项-signature。正确的是-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 
0

-hexdump选项我猜被使用,因为你不希望得到的二进制文件了呢?您可以使用base64二进制编码的签名以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,和二进制sigfile,你可以验证:

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

输出:

Signature Verified Successfully 
相关问题