openssl_verify и «ошибка: 0906D06C: процедуры PEM: PEM_read_bio: нет начальной строки» - PullRequest
12 голосов
/ 30 августа 2010

Я пытаюсь использовать функцию OpenSSL для подписи / проверки RSA в PHP.Когда я пытаюсь сделать openssl_verify, используя мой открытый ключ, я получаю эту ошибку: error:0906D06C:PEM routines:PEM_read_bio:no start line, но сама функция работает правильно (возвращает 0, если сообщения были изменены, и1, если не повреждено).openssl_sign отлично работает.

Как я могу это исправить?

В настоящее время я использую открытый ключ, сгенерированный openssl:

define("SC_MSG_PUBLIC", <<<EOD
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALjPcOckMHDVLiUstcRwwx8kF5PzsiEs
rskyndWisbXMLU9BHomXwL7Qg2L91jE+sNSobkzBDF41CbwDiNlofZUCAwEAAQ==
-----END PUBLIC KEY-----
EOD
);

Любые идеи, почему эта ошибка вызывает,но все работает нормально?

Пытался сгенерировать открытый ключ из частного и использовать его, но он оказался точно таким же, то же сообщение об ошибке: -S

$pkey = openssl_pkey_get_private(SC_MSG_PRIVATE);
$keyDetails = openssl_pkey_get_details($pkey);
file_put_contents('c:\publickey', $keyDetails['key']);

Также,Я пытался установить новые версии всего (PHP 5.3.1, OpenSSL 1.0.0a) - тот же результат.И я на окнах.

Ответы [ 4 ]

15 голосов
/ 03 сентября 2010

Вы пытались вызвать openssl_verify () с (возможно, самоподписанным) сертификатом, содержащим ваш открытый ключ вместо чистого открытого ключа?

Насколько я знаю, некоторые функции PHP OpenSSL не поддерживают должным образом открытые открытые ключи, хотя кажется странным, что они проверяются правильно, несмотря на ошибку.

<?php
$private = openssl_pkey_get_private(file_get_contents('private'), 'passphrase');

// This causes the "no start line" error when using a naked public key:
$public  = openssl_pkey_get_public(file_get_contents('public')); // <-- this should be cert

echo openssl_error_string()."\n";

openssl_sign('Test', $sig, $private);
var_dump(openssl_verify('Test', $sig, $public));

echo openssl_error_string()."\n";
?>

Пример преобразования открытого ключа в простой сертификат в оболочке Linux / UNIX, такой как bash (подробнее см. Документацию OpenSSL или некоторые учебные пособия):

# Create certificate request
openssl req -new -days 3600 -key [PRIVATE-KEY-FILE] -out [REQUEST-TMP-FILE]

# Create certificate from request
RANDFILE=[RANDOM-TMP-FILE] openssl x509 -req -in [REQUEST-TMP-FILE] -signkey [PRIVATE-KEY-FILE] -out [CERTIFICATE-OUT-FILE]

Это также создаст временные файлы, которые вы, возможно, захотите удалить впоследствии, а именно [REQUEST-TMP-FILE] и [RANDOM-TMP-FILE] .

Пример кода PHP можно найти по адресу http://de.php.net/manual/en/function.openssl-csr-new.php.

3 голосов
/ 08 сентября 2010

В тех случаях, когда у всех остальных имеется ошибка, которая автоматически сбрасывается в ноль при успешных операциях, в OpenSSL есть «стек ошибок», который необходимо очистить вручную.См. Функцию openssl_error_string , которая реализована в терминах ERR_get_error .Скорее всего, сообщение об ошибке, которое вы видите, не имеет ничего общего с вашим кодом;попробуйте добавить это перед вашим кодом:

while ($msg = openssl_error_string()) {};

и между каждой строкой:

while ($msg = openssl_error_string())
    echo "OpenSSL error when doing foo:" . $msg . "<br />\n";
2 голосов
/ 01 сентября 2010

Возможно, вам будет проще использовать phpseclib для создания / проверки подписи:

http://phpseclib.sourceforge.net/documentation/misc_crypt.html#misc_crypt_rsa_examples

1 голос
/ 30 августа 2010

Причина:

Эта ошибка обычно вызывается одним поврежденным символом в начале файла .crt.Таким образом, есть вероятность, что у вас есть дополнительный пробел, дополнительный символ, дополнительная строка и т. Д. В файле сертификата SSL (.crt) или в файле ключа SSL (.key).

Возможное решение(s):

  1. Проверьте ваш файл .crt.
  2. Возможно, проблема с символом в вашем ключе, попробуйте это (без разрывов строк и т. Д.):

.

define("SC_MSG_PUBLIC", "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALjPcOckMHDVLiUstcRwwx8kF5PzsiEsrskyndWisbXMLU9BHomXwL7Qg2L91jE+sNSobkzBDF41CbwDiNlofZUCAwEAAQ==");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...