12
votes

openssl_verify and "Erreur: 0906D06C: routines PEM: pem_read_bio: aucune ligne de départ"

J'essaie d'utiliser OpenSSL fonction pour le signe RSA / Vérifiez dans PHP. Lorsque j'essaie de faire openssl_verify code> à l'aide de ma clé publique, je reçois cette erreur: ERREUR: 0906D06C: routines PEM: PEM_READ_BIO: Aucune ligne de départ code> strong>, mais la fonction elle-même fonctionne correctement (renvoie 0 si les messages ont été modifiés et 1 si intact). openssl_sign code> fonctionne bien.

Comment puis-je résoudre ce problème? p>

Actuellement, j'utilise la clé publique générée par openssl: p>

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


1 commentaires

Vous devez conserver le CR / LF aux limites d'encapsulation ( ----- commencer la clé publique ----- et -------- ). Notez qu'il s'agit d'une paire CR / LF; et pas un CR (OS X) et non un LF (Linux). OpenSSL ne parvient pas à analyser PEM sans eux. Vous devez également vous assurer que la longueur d'une ligne est inférieure à 1000 caractères. Voir aussi RFC 1421, section 4.3.1, contraintes .


4 Réponses :


0
votes

Raison:

Cette erreur est généralement causée par un caractère corrompu au début du fichier .crt. Donc, les chances sont que vous avez un espace supplémentaire, un personnage supplémentaire, une ligne supplémentaire, etc. dans le fichier de certificat SSL (.CRT) ou le fichier de clé SSL (.Key).

possible Solution (s):
  1. Vérifiez votre fichier .crt.
  2. Le problème du personnage peut être dans votre clé, essayez ceci (sans chevrefreau, etc.):

    . xxx


1 commentaires

N'a pas aidé, il ne peut pas analyser la clé en 1 ligne. Il n'apparaît que si c'est dans ces 4 lignes.



2
votes

Vous pouvez avoir un temps plus facile à utiliser phpseclib pour la création / vérification de la signature:

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


3 commentaires

Cela pourrait fonctionner, mais c'est un peu étrange ... une bibliothèque originale et très optimisée largement utilisée, nous devons utiliser un code lent de code d'octet ....


La partie lente de la RSA est la mathématique et depuis que Phpseclib's Crypt_rsa utilise GMP, s'il est disponible, la vitesse n'est pas une grande partie du problème. En fait, la partie vraiment lente est la génération de clé. Tout le reste, même si la mise en œuvre de PHP PHP PHP PHPECLIB est utilisée, est assez rapide. Essayez-le si votre sceptique. La chose à propos de OpenSSL est que cela est destiné aux développeurs C. Les liaisons PHP sont subpares et l'API n'est pas, IMHO, intuitive pour les développeurs PHP.


Cela fonctionnerait dans le pire des cas, mais je préférerais préférer travailler avec OpenSSL, sa norme DEFACTO et le message que je travaille avec PHP va également être signé / vérifié par une partie C ++ à l'aide de OpenSSL, une consistance supplémentaire serait donc une cohérence supplémentaire plus.



16
votes

Avez-vous essayé d'appeler openssl_verify () forte> avec un certificat (peut-être auto-signé) contenant votre clé publique au lieu d'une clé publique pure?

Autant que je sache, certains PHP OpenSSL Les fonctions ne supportent pas correctement les touches publiques nues bien qu'il semble étrange qu'il vérifie correctement malgré l'erreur. p> xxx pré>

exemple pour convertir une clé publique en un simple certificat Shell Linux / Unix telle que BASH (reportez-vous à la documentation OpenSSL ou à certains didacticiels pour plus): P>

# 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]


3 commentaires

C'est une solution parfaite. Merci pour des étapes pour générer un certificat de ma clé. Vous avez un joli rep up :-)


PHP a résolu cet horrible, un pub nu ferait une utilisation pour beaucoup de gens tellement plus facilement. La blague est que vous pouvez pointer le funktion OpenSSL dans un fichier pub nu sur le disque, mais pas sur le même contenu que String Literal! Comme littéral, vous avez besoin du certificat. Merci beaucoup pour le souligner, m'a sauvé beaucoup de temps.


Non, que dit John ne fonctionne pas pour moi. J'ai dû créer un certificat (auto-signé) pour pouvoir lire la clé publique.



4
votes

où tout le monde a un errno qui est réinitialisé à zéro automatiquement 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 implémenté 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 ceci avant votre code:

while ($msg = openssl_error_string())
    echo "OpenSSL error when doing foo:" . $msg . "<br />\n";


0 commentaires