web-dev-qa-db-fra.com

Conversion de clés entre openssl et openssh

Si j'utilise ce qui suit

openssl req -x509  -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes

Je reçois private.pem et public.pem

Si j'utilise

ssh-keygen -t rsa -f rsa

Je reçois rsa et rsa.pub

Est-il possible de convertir du format de rsa en private.pem et vice-versa?

Edit: Pour être plus précis,

a) Si j'ai le private.pem et public.pem généré par la commande ci-dessus, comment obtenir la clé privée et la clé publique rsa équivalentes?

b) Étant donné les rsa et rsa.pub, comment puis-je obtenir les clés x509 si je connais les métadonnées supplémentaires prises par la commande openssl ci-dessus?

Si je passe du format openssh à x509 et vice-versa, je devrais idéalement récupérer le même fichier de clé.

62
anshul

Vous manquez un peu ici.

ssh-keygen Peut être utilisé pour convertir des clés publiques de formats SSH en formats PEM adaptés à OpenSSL. Les clés privées sont normalement déjà stockées dans un format PEM adapté aux deux.

Cependant, la commande OpenSSL que vous montrez génère un auto-signé certificat. Ce certificat n'est pas quelque chose qu'OpenSSH utilise traditionnellement pour quoi que ce soit - et ce n'est certainement pas la même chose qu'une clé publique.

OpenSSH prend également en charge les certificats, mais il est probable que vous n'utilisiez pas cette prise en charge. De plus, ces certificats ne sont pas X.509, ils sont donc incompatibles avec OpenSSL.

Le certificat contient des informations qui ne sont présentes nulle part ailleurs et chaque certificat est unique et ne peut pas être recréé à volonté. Cela signifie que vous devez stocker le certificat X.509, en plus de la clé privée, si vous souhaitez utiliser la même clé pour OpenSSL et OpenSSH.


Si vous souhaitez simplement partager la clé privée, la clé OpenSSL générée par votre exemple de commande est stockée dans private.pem, Et elle devrait déjà être au format PEM compatible avec (récente) OpenSSH. Pour en extraire une clé publique compatible OpenSSH, vous pouvez simplement exécuter:

ssh-keygen -f private.pem -y > private.pub

Si vous souhaitez commencer à partir d'OpenSSH et progresser vers le côté OpenSSL, avec un certificat auto-signé (pour une raison quelconque), voici comment:

$ ssh-keygen -f test-user
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in test-user.
Your public key has been saved in test-user.pub.
The key fingerprint is:
ff:36:f1:74:c7:0d:4e:da:79:5c:96:27:2c:2c:4e:b6 naked@tink
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|           . .  .|
|          + o =.+|
|        S+ o * B+|
|         .E o = B|
|          .  + o.|
|           .o .  |
|           ...   |
+-----------------+
$ openssl req -x509 -days 365 -new -key test-user -out test-user-cert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
$ ls -l test-user*
-rw------- 1 naked naked 1675 Mar 18 21:52 test-user
-rw-r--r-- 1 naked naked 1229 Mar 18 21:53 test-user-cert.pem
-rw-r--r-- 1 naked naked  392 Mar 18 21:52 test-user.pub

À partir de ceux-ci, les fichiers test-user Et test-user-cert.pem Sont essentiels à conserver, où test-user.pub Peut toujours être recréé à partir de l'utilisateur de test selon les besoins.

42
Nakedible

Le ssh-keygen L'outil openssh peut le faire pour vous.

La commande suivante convertira le .pub fichier au format pem pour vous.

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

Le ssh-keygen prend également en charge la conversion dans divers autres formats. Pour plus d'informations, consultez la page man .

39
user10211

Les versions plus récentes d'OpenSSL (> = 1.0.1 au moins) utilisent le format PKCS # 8 pour les clés.

Donc, si vous extrayez la clé publick du certificat à l'aide de la commande

openssl x509 -in certificate.pem -noout -pubkey >pubkey.pem

Vous devez utiliser la commande suivante pour la convertir en entrée authorized_keys

ssh-keygen -i -m PKCS8 -f pubkey.pem

- out L'option de la commande req d'OpenSSL produit une demande de certificat plutôt qu'une clé publique.

Pour extraire la clé publique au format PKCS # 8, compréhensible par la fonction d'importation de ssh-keygen utilisez la commande suivante.

openssl req -in public.pem -noout -pubkey
10
Victor Wagner

Une clé RSA publique de 2048 bits peut être convertie du format PEM X.509 au format OpenSSH avec les commandes suivantes (cf. réponse ). Il ne serait pas difficile d'écrire la conversion dans l'autre sens étant donné les informations de la réponse liée.

echo -n "ssh-rsa " > rsa2048.pub
grep -v -- ----- rsa2048.pem | base64 -d | dd bs=1 skip=32 count=257 status=none | xxd -p -c257 | sed s/^/00000007\ 7373682d727361\ 00000003\ 010001\ 00000101\ / | xxd -p -r | base64 -w0 >> rsa2048.pub
echo >> rsa2048.pub
5
mkalkov

Je n'ai pas trouvé d'outil pour le travail, alors je me suis sali les mains et j'en ai écrit quelques-unes à la main en lisant le code source d'OpenSSH et certains débogueurs PEM/DER en ligne.

Je l'ai écrit pour convertir entre PKCS8, PKCS1 (RSA uniquement), SEC1 (ECDSA uniquement) et le format OpenSSH "propriétaire" pour les clés RSA de toute taille et ECDSA P-256 et P-384.

Installer

Il est écrit pour node.js (et je travaille à le porter sur le navigateur), vous devez donc l'installer d'abord:

Et alors:

npm install -g rasha eckles ssh-to-jwk jwk-to-ssh

Rasha est pour RSA, Eckles est pour ECDSA.

PEM à OpenSSH

RSA

rasha privkey.pem > privkey.jwk.json

jwk-to-ssh privkey.jwk.json root@localhost > id_rsa

jwk-to-ssh privkey.jwk.json root@localhost public > id_rsa.pub

ECDSA

eckles privkey.pem > privkey.jwk.json

jwk-to-ssh privkey.jwk.json root@localhost > id_ecdsa

jwk-to-ssh privkey.jwk.json root@localhost public > id_ecdsa.pub

OpenSSH à PEM

RSA

ssh-to-jwk id_rsa > privkey.jwk.json

rasha privkey.jwk.json > privkey.pem

rasha privkey.jwk.json public > pubkey.pem

ECDSA

ssh-to-jwk id_ecdsa > privkey.jwk.json

eckles privkey.jwk.json > privkey.pem

eckles privkey.jwk.json public > pubkey.pem
2
CoolAJ86

J'ai réussi à utiliser l'outil Windows puttygen.exe pour cela:

enter image description here

Donc:

  1. Chargez votre clé privée dans puttygen (répondez au défi de la phrase secrète)
  2. Une fois chargé, sélectionnez comme dans l'image ci-dessus Conversions -> Exporter la clé OpenSSH donnez-lui un nom et cela devrait fonctionner, cela a fonctionné pour moi.
1
yonsk