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

49

J'ai un problème avec la génération d'une clé publique que la PEM_read_bio_RSA_PUBKEY()fonction openssl peut consommer. Je continue à avoir des erreurs.

Évidemment, je ne peux pas simplement utiliser la chaîne ASCII dans le ssh-keygen <>.pubfichier de clé car elle est au format de fichier SSH ou peut-être que je SubjectPublicKeyInfostructure.

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

J'ai trouvé un convertisseur php sur le Web qui convertira le contenu de la clé publique en un format de chaîne ASCII PEM base64. 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 puis-je obtenir ma clé publique OpenSSH dans un format que la fonction OpenSSL va consommer?

PeteP
la source
Compris ceci: utilisez l'outil openssl uniquement en tant que tel:
PeteP
Créer une clé privée: openssl genrsa -out test.priv.key 2048; Clé publique de sortie au même format (PEM?): Openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP
Cross-related security.stackexchange.com/questions/32768/…
dave_thompson_085

Réponses:

57

D'ACCORD!

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

Le premier problème est donc que (selon les pages de manuel pour OpenSSL (man 3 pem)), OpenSSL s'attend à ce que la clé RSA soit au format PKCS # 1. Clairement, ce n’est pas ce avec quoi ssh-keygen travaille. Vous avez deux options (de rechercher autour de).

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

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

La méthode la plus longue consiste à diviser votre clé SSH en plusieurs composants (l’ entrée de blog dans laquelle je trouve une partie de cette accusation accuse OpenSSH d’être "propriétaire", je préfère l’appeler "unique"), puis utiliser une bibliothèque ASN1. pour échanger des choses.

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

https://gist.github.com/1024558

Brian Redbeard
la source
9
La ssh-keygenméthode semble fonctionner sous Linux mais pas sous Mac OS X.
lid
3
Couvercle, voir la note dans la réponse à propos de la version SSH. OS X ne fournit pas de version récente d'OpenSSH. Exécutez la commande ssh -V.
Brian Redbeard
3
Ne fonctionne pas dans OpenSSH_6.2p2. Travaille dans OpenSSH_6.6p1.
Ancien Pro
-mne fonctionne pas pour moi ... quel est le travail autour?
pstanton
2
Fonctionne pour moi sur mac!
Greg Hornby
18

En supposant que vous ayez la clé privée SSH id_rsa, vous pouvez en extraire la clé publique de la manière suivante:

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

Je me rends compte que le PO a demandé de convertir une clé publique, cela ne répond donc pas tout à fait à la question, mais j’ai pensé que cela serait utile pour certains de toute façon.

Notez également que cette commande génère un format de clé publique PEM, qui correspond généralement à ce que OpenSSL attend. La réponse de Brian, en revanche, donne 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_indrapeau). Pour convertir, vous pouvez faire ceci:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem
shawkinaw
la source
Merci, le -pubout de la clé privée a fait l'affaire pour moi.
Shaun Dewberry
openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pemfonctionne également (c’est-à-dire que l’entrée est une clé privée au format pem). Bonne réponse.
Johnny Wong
1
Mise à jour: La réponse de Brian a été corrigée -m pkcs8qui, malgré les gens OpenSSH en utilisant le mauvais nom ne produit X.509 « pubkey ». En outre, depuis OpenSSH 6.5 en 2014-01 si le créateur a spécifié le "nouveau format" -opour une meilleure sécurité, cette méthode ne fonctionnera pas et, depuis la version 7.8 de 2018-08, "nouveau format" est désormais la valeur par défaut, idem.
dave_thompson_085
11

Le format que vous voulez est ce qui ssh-keygenappelle PKCS8. Donc, la commande suivante produira la sortie désirée:

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

De la ssh-keygenpage 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''.
Aaron Meriwether
la source
Celui-ci fonctionne réellement à la fois sur Linux et macOS.
Jay Taylor
extraire la clé publique générée équivalente de la clé privée dans OpenSSL openssl rsa -in key -pubout -out key.pub.openssl.pkcs8
lundi
6

Semblable à la méthode d'Amal Chaudhuri ci-dessous, c'est ce qui a fonctionné pour moi. Je devais 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
l3e0wu1f
la source
cela ne semble pas réellement fonctionner.
extérieur2344
5
Ceci fonctionne UNIQUEMENT pour la clé RSA privée PAS la clé publique que l'OP demandait. Donc, mauvaise réponse.
Devy
3
En fait, id_rsadéjà dans le bon format, vous pouvez le vérifier vous-même, le résultat id_rsa.pemest 100% identique.
Miro Kropacek
-2

Une autre façon de faire cela depuis un autre site. Publier ceci au cas où vous auriez besoin d'une autre méthode. Fonctionne très bien. http://www.chatur.com.np/2011/01/convert-openssh-rsa-key-to-pem-format.html

openssl dsa -in ~/.ssh/id_dsa -outform pem > id_dsa.pem
Amal Chaudhuri
la source
Cette méthode ne semble pas réellement fonctionner.
Sean
7
id_rsan'est pas une clé publique. Mauvaise réponse.
Ahmet Alp Balkan