2015-12-07 2 views
0

У меня есть эта ошибка с этим файлом:openssl_verify, Предупреждение: openssl_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); 
$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-файла, первый из которых подписал документ, второй - подписи. Я просто не знаю, как взять подпись из первого документа. Он решил собрать все вместе, чтобы попробовать ... Как я могу исправить?

ответ

0
  1. Вы абсолютно уверены, что ваш файл открытого ключа короче, чем 8192 байт? Если вы просто хотите прочитать файл в переменной, используйте file_get_contents(), это намного проще.
  2. Что сделал openssl_get_publickey($cert)?
  3. Основываясь на полученной ошибке, OpenSSL ожидает отформатированные ключи PEM, поэтому вам нужно будет ее преобразовать.

Try:

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

эта ошибка: Фатальная ошибка: Uncaught исключение 'Exception' с сообщением 'ошибка: 0906D06C: PEM подпрограммы: PEM_read_bio: нет линия старта' в C: \ Users \ User \ Desktop \ xampp \ htdocs \ verificaFirma.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

+0

@hisecure Обновлен ответ. – Sammitch

+0

теперь верните эту ошибку с кодом. Неустранимая ошибка: исключение исключения «Исключение» с сообщением: 0D0680A8: asn1 процедуры кодирования: ASN1_CHECK_TLEN: неправильный тег ' – hisecure

Смежные вопросы