openssl_verify,警告:openssl_vverify():不能将提供的密钥参数强制转换为公钥


openssl_verify , Warning: openssl_verify(): supplied key param cannot be coerced into a public key

我在这个文件中有这个错误:

<?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文件,第一个用于签署文档,第二个用于ke-me签名。我只是不知道如何从第一份文件上取下签名。何决定把这一切放在一起尝试。。。我该如何修复?

  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());
}