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é.
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.
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 .
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
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
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.
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.
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
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
J'ai réussi à utiliser l'outil Windows puttygen.exe pour cela:
Donc: