无法在PHP中验证openssl签名

时间:2012-05-15 04:17:53

标签: php openssl digital-signature public-key

如果我使用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

但是,如果我尝试使用php中的openssl库验证签名,则会失败。

$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很好地玩?这些示例已经过简化,但可以满足我的需求。在现实世界中,我只会拥有数据,签名和公钥......

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

对于phpseclib,请在调用$ rsa-> verify()之前尝试$ rsa-> setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1)。