Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php openssl_verify,警告:openssl_verify():无法将提供的密钥参数强制转换为公钥_Php_Openssl_Signature_Verify - Fatal编程技术网

Php openssl_verify,警告:openssl_verify():无法将提供的密钥参数强制转换为公钥

Php openssl_verify,警告:openssl_verify():无法将提供的密钥参数强制转换为公钥,php,openssl,signature,verify,Php,Openssl,Signature,Verify,我对此文件有以下错误: <?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); $pk

我对此文件有以下错误:

<?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文件,第一个是为文档签名的,第二个是为我签名的。我只是不知道如何从第一份文件中提取签名。何决定将其全部放在一起尝试。。。我该怎么修理

  • 您是否绝对确定您的公钥文件小于8192字节?如果您只是想将文件读入变量,那么使用
    file\u get\u contents()
    ,就简单多了
  • openssl\u获得公钥($cert)
    返回了什么
  • 根据您得到的错误,OpenSSL似乎需要PEM格式的密钥,因此您需要对其进行转换
  • 尝试:


    此错误:致命错误:C:\Users\User\Desktop\xampp\htdocs\verificaFirma.php:23堆栈跟踪:#0{main}中的未捕获异常“exception”,消息为“error:0906D06C:PEM例程:PEM#u read_bio:no start line”。。。这是代码:$fp=fopen(“key.pem”、“r”)$priv_key=fread($fp,100000);fclose($fp)$pkeyid=openssl_get_privatekey($priv_key);openssl_-sign($toSign,$signature,$pkeyid);openssl免费密钥($pkeyid);echo(签名)$cert=file_get_contents('C:/Users/User/Desktop/xampp/htdocs/pubkey.der');如果(!$pubkeyid=openssl\u get\u publickey($cert)){throw new\Exception(openssl\u error\u string());}@hisecure更新了答案。现在将此错误与您的代码一起返回致命错误:未捕获异常“exception”,并显示消息“error:0D0680A8:asn1编码例程:asn1\u CHECK\t len:error tag”@hisecure您能将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());
    }