2012-05-15 60 views
2

如果我使用openssl创建新的密钥对,请使用私钥签署一些数据,并使用公钥来验证签名......它的工作原理。未能在PHP中验证openssl签名

$ openssl genrsa -out mykey.pem 1024 
$ openssl rsa -in mykey.pem -pubout > mypubkey.pem 
$ echo 'It could be bunnies' > file.txt 
$ openssl rsautl -sign -in file.txt -inkey mykey.pem -out sig.txt 
$ openssl rsautl -verify -in sig.txt -inkey mypubkey.pem -pubin 
It could be bunnies 

不过,如果我尝试使用OpenSSL库在PHP验证签名失败。

$pubkey = openssl_pkey_get_public(file_get_contents('/var/key/mypubkey.pem')); 
$sig = file_get_contents('/var/key/sig.txt'); 
$data = file_get_contents('/var/key/file.txt'); 
$verifyResult = (openssl_verify($data, $sig, $pubkey) == 1); 

类似的故事Crypt_RSA

$pubkey = file_get_contents('/var/test/mypubkey.pem'); 
$sig = file_get_contents('/var/test/sig.txt'); 
$data = file_get_contents('/var/test/file.txt'); 
$rsa = new Crypt_RSA(); 
$rsa->loadKey($pubkey); 
$rsa->verify($data, $sig); 
$verifyResult = $rsa->verify($data, $sig); 

如何让PHP很好的发挥?这些例子虽然简单但却准确地符合我的需求。在现实世界中,我只有数据,签名和公钥...

回答

1

对于phpseclib,调用$ rsa-先试$ rsa-> setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1)>验证()。

+0

目前的Crypt_RSA文档似乎表明PKCS1是默认的。但是,我没有尝试在验证之前显式调用setSignatureMode,因此您可能很正确。由于我的代码已经移动,并且现在测试起来很不方便,所以给了你怀疑的好处(以及复选标记)。感谢您的回复... –

+0

默认为CRYPT_RSA_SIGNATURE_PSS。它提供更好的安全性,但不兼容。 – neubert

2

我真的希望有人会在公钥问题上给出明确的答案。似乎它应该工作。但是,在此期间,我已经从公钥转换为自签名证书。 PHP中的openssl库似乎很满意从中提取可接受的公钥。这意味着真正的问题(验证签名数据)解决了我的问题。服务器客户端现在将拥有数据,签名和x.509证书。

这里是代码片段。

$ openssl genrsa -out server.key 4096 
$ openssl req -new -key server.key -out server.csr 
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 
$ openssl dgst -sha1 -sign server.key -out file.sha1 file.txt 

...

$pubkey = openssl_pkey_get_public(file_get_contents('/var/key/server.crt')); 
$sig = file_get_contents('/var/key/file.sha1'); 
$data = file_get_contents('/var/key/file.txt'); 
$verifyResult = (openssl_verify($data, $sig, $pubkey) == 1);