openssl_verify и "error: 0906D06C: PEM-процедуры: PEM_read_bio: нет стартовой строки"

Я пытаюсь использовать 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) – тот же результат. И я нахожусь на окнах.

Вы пытались вызвать 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 .

Если у всех остальных есть ошибка, которая автоматически сбрасывается до нуля посредством успешных операций, 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"; 

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

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

Причина:

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

Возможные решения):

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

,

 define("SC_MSG_PUBLIC", "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALjPcOckMHDVLiUstcRwwx8kF5PzsiEsrskyndWisbXMLU9BHomXwL7Qg2L91jE+sNSobkzBDF41CbwDiNlofZUCAwEAAQ==");