【问题标题】:Failure to verify openssl signatures in PHP无法在 PHP 中验证 openssl 签名
【发布时间】:2012-05-22 13:43:36
【问题描述】:

如果我使用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 玩得很好?这些示例经过简化,但符合我的需要。在现实世界中,我将只有数据、签名和公钥......

【问题讨论】:

    标签: php openssl digital-signature public-key


    【解决方案1】:

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

    这里是代码 sn-p(s)。

    $ 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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 当前的 Crypt_RSA 文档似乎表明 PKCS1 是默认值。但是,我没有尝试在验证之前显式调用 setSignatureMode,因此您很可能是正确的。自从我的代码继续前进并且现在不方便测试以来,给您带来了疑问(和复选标记)的好处。感谢您的回复...
      • 默认为 CRYPT_RSA_SIGNATURE_PSS。它提供了更好的安全性,但不那么兼容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      相关资源
      最近更新 更多