openssl de vérifier et de "erreur:0906D06C:PEM routines:PEM lire la bio:pas de ligne de départ"
j'essaie d'utiliser la fonction OpenSSL pour signer RSA/verifier en PHP.
Quand j'ai essayer de faire openssl_verify
en utilisant ma clé publique, j'obtiens cette erreur:error:0906D06C:PEM routines:PEM_read_bio:no start line
, mais la fonction elle-même fonctionne correctement (renvoie 0 si les messages ont été modifiés, et 1 si intact). openssl_sign
fonctionne très bien.
Comment puis-je résoudre ce problème?
Actuellement, j'utilise la clé publique générée par openssl:
define("SC_MSG_PUBLIC", <<<EOD
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALjPcOckMHDVLiUstcRwwx8kF5PzsiEs
rskyndWisbXMLU9BHomXwL7Qg2L91jE+sNSobkzBDF41CbwDiNlofZUCAwEAAQ==
-----END PUBLIC KEY-----
EOD
);
N'importe quelles idées pourquoi cette erreur déclenche, mais les choses fonctionnent amende?
a essayé de générer la clé publique à partir de privé, et l'utiliser, mais il semblait être exactement le même, même message d'erreur: - S
$pkey = openssl_pkey_get_private(SC_MSG_PRIVATE);
$keyDetails = openssl_pkey_get_details($pkey);
file_put_contents('c:publickey', $keyDetails['key']);
aussi, j'ai essayé d'installer de nouvelles versions de everything (PHP 5.3.1, OpenSSL 1.0.0 a) - même résultat. Et, je suis sur windows.
4 réponses
Avez-vous essayé d'appeler openssl_verify () avec un certificat (peut-être auto-signé) contenant votre clé publique au lieu d'une simple clé publique ?
<?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";
?>
exemple pour convertir une clé publique en un simple certificat dans un shell Linux/UNIX tel que bash (se référer à L'OpenSSL de la documentation ou des tutoriels pour plus d'):
# 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]
cela créera aussi des fichiers temporaires que vous pourriez supprimer par la suite, à savoir [REQUEST-TMP-FILE] et [RANDOM-TMP-FILE].
le code d'exemple PHP peut être trouvé à http://de.php.net/manual/en/function.openssl-csr-new.php.
lorsque tout le monde a un errno qui est automatiquement remis à zéro par des opérations réussies, OpenSSL a une "pile d'erreurs", que vous devez vider manuellement. Voir la fonction openssl_error_string qui est mise en œuvre en termes de ERR_get_error. Les Chances sont que le message d'erreur que vous voyez n'a rien à voir avec votre code; essayez d'ajouter cet avant votre code:
while ($msg = openssl_error_string()) {};
et entre chaque ligne:
while ($msg = openssl_error_string())
echo "OpenSSL error when doing foo:" . $msg . "<br />\n";
vous pourriez avoir un temps plus facile en utilisant phpseclib pour la création / vérification de signature:
http://phpseclib.sourceforge.net/documentation/misc_crypt.html#misc_crypt_rsa_examples
Raison:
Cette erreur est généralement causée par une corruption personnage au début de la .fichier crt. Donc, les chances sont que vous avez un espace supplémentaire, un supplément de caractère, une ligne supplémentaire, etc. dans le fichier de certificats SSL (.crt) ou le fichier de clés SSL (.clé.)
Solution(s) Possible:
- Vérifiez votre .fichier crt.
- le problème de caractère peut être dans votre clé, essayez ceci (sans linebreaks, etc):
.
define("SC_MSG_PUBLIC", "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALjPcOckMHDVLiUstcRwwx8kF5PzsiEsrskyndWisbXMLU9BHomXwL7Qg2L91jE+sNSobkzBDF41CbwDiNlofZUCAwEAAQ==");