web-dev-qa-db-fra.com

Comment convertir une clé publique ssh-keygen en un format que la fonction openssl PEM_read_bio_RSA_PUBKEY () consommera?

Je rencontre un problème en générant une clé publique que la fonction openssl PEM_read_bio_RSA_PUBKEY() peut consommer. Je continue à recevoir des erreurs.

Évidemment, je ne peux pas simplement utiliser la chaîne ASCII dans le ssh-keygen <>.pub fichier clé tel qu'il est au format de fichier SSH ou je structure peut-être SubjectPublicKeyInfo.

Voici le code gen clé: ssh-keygen -t rsa -b 1024 -C "Test Key"

J'ai trouvé un convertisseur en php sur le web qui convertira le contenu de la clé publique au format PEM base64 ASCII format chaîne. Cependant, la fonction ne l'aime toujours pas.

La documentation Openssl indique:

  1. "Fonction RSA_PUBKEY () qui traite une clé publique à l'aide d'une structure EVP_PKEY"
  2. "Les fonctions RSA_PUBKEY traitent également une clé publique RSA à l'aide d'une structure RSA"

Comment obtenir ma clé publique OpenSSH dans l'un ou l'autre des formats que la fonction OpenSSL utilisera?

53
PeteP

D'ACCORD!

Alors je suis entré dans cette pensée "Facile, j'ai compris." Il s'avère qu'il y a beaucoup plus que je ne le pensais.

Donc, le premier problème est que (selon les pages de manuel pour OpenSSL (man 3 pem)), OpenSSL s'attend à ce que la clé RSA soit au format PKCS # 1. De toute évidence, ce n'est pas avec cela que ssh-keygen travaille. Vous avez deux options (de chercher autour).

Si vous avez OpenSSH v. 5.6 ou version ultérieure (je ne l'ai pas fait sur mon ordinateur portable), vous pouvez exécuter ceci:

ssh-keygen -f key.pub -e -m pem

La méthode la plus longue consiste à séparer votre clé SSH en ses différents composants (le entrée de blog J'ai trouvé une partie de cela en accusant OpenSSH d'être "propriétaire", je préfère l'appeler "unique" ), puis utilisez une bibliothèque ASN1 pour permuter les choses.

Heureusement pour vous, quelqu'un a écrit le code pour ce faire:

https://Gist.github.com/1024558

61
Brian Redbeard

En supposant que vous disposez de la clé privée SSH id_rsa, vous pouvez en extraire la clé publique comme suit:

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem

Je me rends compte que l'OP a demandé la conversion d'une clé publique, donc cela ne répond pas tout à fait à la question, mais j'ai pensé que ce serait utile pour certains de toute façon.

Notez également que cette commande entraîne un format de clé publique PEM, qui est généralement ce qu'OpenSSL attend. D'un autre côté, la réponse de Brian se traduit par un fichier au format RSAPublicKey, qui n'est pas le format normal attendu par OpenSSL (bien que les versions ultérieures puissent apparemment le lire via le -RSAPublicKey_in drapeau). Pour convertir, vous pouvez faire ceci:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem
20
shawkinaw

Le format que vous voulez est ce que ssh-keygen appels PKCS8. Ainsi, la commande suivante produira la sortie souhaitée:

ssh-keygen -f key.pub -e -m pkcs8

Du ssh-keygen page de manuel:

-m key_format
         Specify a key format for the -i (import) or -e (export) conversion 
         options.  The supported key formats are: 
         ``RFC4716'' (RFC 4716/SSH2 public or private key), 
         ``PKCS8'' (PEM PKCS8 public key) or 
         ``PEM'' (PEM public key).  
         The default conversion format is ``RFC4716''.
12
Aaron Meriwether

Semblable à la méthode d'Amal Chaudhuri ci-dessous, c'est ce qui a fonctionné pour moi. J'avais besoin de créer un fichier pem à partir de la clé publique ssh que j'avais générée pour mon client SFTP (Cyberduck).

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
7
l3e0wu1f