【问题标题】:openssl_verify , Warning: openssl_verify(): supplied key param cannot be coerced into a public key [duplicate]openssl_verify,警告:openssl_verify():提供的密钥参数不能被强制转换为公钥[重复]
【发布时间】:2015-12-07 18:25:09
【问题描述】:

这个文件有这个错误:

<?php
// $data and $signature are assumed to contain the data and the signature

$signature = null;
$toSign = "C:/Users/User/Desktop/xampp/htdocs/docum.docx";

$fp = fopen("key.pem", "r");
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);

openssl_sign($toSign, $signature, $pkeyid);

openssl_free_key($pkeyid);
echo($signature);
// fetch public key from certificate and ready it
$fp = fopen("C:/Users/User/Desktop/xampp/htdocs/pubkey.der", "r");
$cert = fread($fp, 8192);
fclose($fp);
$pubkeyid = openssl_get_publickey($cert);

// state whether signature is okay or not
$ok = openssl_verify($toSign, $signature, $pubkeyid);
if ($ok == 1) {
    echo "good";
} elseif ($ok == 0) {
    echo "bad";
} else {
    echo "ugly, error checking signature";
}
// free the key from memory
openssl_free_key($pubkeyid);
?>

我该如何解决这个错误?`... 我用文档的私钥计算了签名,现在我想测试它。 起初我创建了两个 php 文件,第一个签署了文件,第二个发生了我签署的。我只是不知道如何从第一个文档中获取签名。何决定将它们放在一起尝试...我该如何解决?

【问题讨论】:

    标签: php openssl signature verify


    【解决方案1】:
    1. 绝对确定您的公钥文件短于 8192 字节吗?如果您只是想将文件读入变量中,请使用 file_get_contents(),这要简单得多。
    2. openssl_get_publickey($cert) 返回了什么?
    3. 根据您收到的错误,OpenSSL 似乎需要 PEM 格式的密钥,因此您需要对其进行转换。

    试试:

    function der2pem($der_data) {
       $pem = chunk_split(base64_encode($der_data), 64, "\n");
       $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n";
       return $pem;
    }
    
    $cert = der2pem(file_get_contents('C:/Users/User/Desktop/xampp/htdocs/pubkey.der'));
    
    if( ! $pubkeyid = openssl_get_publickey($cert) ) {
        throw new \Exception(openssl_error_string());
    }
    

    【讨论】:

    • 此错误:致命错误:在 C:\Users\User\Desktop\xampp\htdocs\verificaFirma 中未捕获异常 'Exception' 并带有消息 'error:0906D06C:PEM routines:PEM_read_bio:no start line' .php:23 堆栈跟踪:#0 {main} ...这是代码:$fp = fopen("key.pem", "r");$priv_key = fread($fp,100000);fclose($ fp);$pkeyid =openssl_get_privatekey($priv_key);openssl_sign($toSign, $signature, $pkeyid);openssl_free_key($pkeyid);echo($signature);$cert=file_get_contents('C:/Users/User/Desktop /xampp/htdocs/pubkey.der');if(!$pubkeyid =openssl_get_publickey($cert)) { throw new \Exception(openssl_error_string());}
    • @hisecure 更新了答案。
    • 现在用您的代码返回此错误 致命错误:未捕获的异常 'Exception' 带有消息 'error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag'
    • @hisecure 您可以将 PEM 格式的公钥发布到某处吗?在这一点上,如果不查看证书,我可以提供的建议不多。
    猜你喜欢
    • 2021-03-01
    • 2014-12-11
    • 2016-04-02
    • 1970-01-01
    • 2019-05-29
    • 2023-03-16
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多