212 votes

Comment extraire une clé publique / privée d'un fichier PKCS12 avec openSSL pour une utilisation ultérieure dans l'authentification SSH-PK?

Je veux extraire le publique et la clé privée à partir de mon fichier PKCS#12 pour les utiliser plus tard dans SSH-une Clé Publique d'Authentification.

Maintenant, im de générer des clés via ssh-keygen que j'ai mis dans .ssh/authorized_key, quelque part sur le côté client.

À l'avenir, je veux utiliser les clés à partir d'un fichier PKCS#12 conteneur, donc j'en ai pour extraire la clé publique d'abord de fichier PKCS#12, puis de les mettre dans le .ssh/authorized_keys. Est-il possible de le faire fonctionner via openssl? Sont les clés PKCS#12 compatible pour ssh-clé publique d'authentification?

318voto

Nilesh Points 1399

Vous pouvez utiliser les commandes suivantes pour extraire une clé publique/privée d'un conteneur PKCS#12 :

  • Clé privée PKCS#1

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
  • Certificats :

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem

7 votes

Les commandes fonctionnent, mais la clé privée est exportée au format PKCS1 et j'ai besoin de PKCS8... Est-ce qu'il y a une option que je manque pour obtenir cela ? Par exemple, il exporte '-----BEGIN RSA PRIVATE KEY-----' mais j'ai besoin de '-----BEGIN PRIVATE KEY-----'.

4 votes

Pour ce faire, vous pouvez essayer openssl rsa -in privateKey.pem -out private.pem

32 votes

@edthethird : Pour obtenir PKCS8, ajoutez l'option -nodes.

95voto

ryanc Points 438

C'est possible avec un peu de conversion de format.

Pour extraire la clé privée dans un format utilisable par openssh :

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

Pour convertir la clé privée en clé publique :

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

Pour extraire la clé publique dans un format utilisable par openssh :

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

3 votes

Merci ! La première ligne était celle dont j'avais besoin. Juste la clé, non cryptée, pour qu'elle puisse être installée via les systèmes automatisés de la plupart des CDN.

2 votes

@PhilipRego Je pense que vous avez confondu les clés publiques et privées. Une clé publique RSA est constituée de deux valeurs, "e" l'exposant public et "n" le module, qui sont toutes deux stockées à côté des parties privées de la clé.

20voto

frzng Points 64

OpenSSH ne peut pas utiliser les fichiers PKCS#12 par défaut. Comme d'autres l'ont suggéré, vous devez extraire la clé privée au format PEM, ce qui vous permet de passer du domaine d'OpenSSL à OpenSSH. Les autres solutions mentionnées ici ne fonctionnent pas pour moi. J'utilise OS X 10.9 Mavericks (10.9.3 en ce moment) avec des utilitaires "prépackagés" (OpenSSL 0.9.8y, OpenSSH 6.2p2).

Tout d'abord, extrayez une clé privée au format PEM qui sera utilisée directement par OpenSSH :

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

Je suggère fortement de crypter la clé privée avec un mot de passe :

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

Évidemment, écrire un mot de passe en clair sur la ligne de commande n'est pas sûr non plus, vous devez donc supprimer la dernière commande de l'historique ou vous assurer qu'elle n'y arrive pas. Les différents shells ont des méthodes différentes. Vous pouvez préfixer votre commande par un espace pour éviter qu'elle ne soit enregistrée dans l'historique dans Bash et dans de nombreux autres shells. Voici également comment supprimer la commande de l'historique dans Bash :

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

Alternativement, vous pouvez utiliser une autre méthode pour passer un mot de passe de clé privée à OpenSSL - consulter Documentation OpenSSL pour les arguments de phrase de passe .

Ensuite, créez une clé publique OpenSSH qui peut être ajoutée au fichier authorized_keys :

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

0 votes

Quel est le | openssl rsa pour quoi faire ?

1 votes

@Snekse il s'assure qu'il n'y a que la clé privée dans la sortie. Dans mon cas, il crée un fichier d'identité ( ~/.ssh/id_rsa ) avec quelques "cruft" comme Bag Attributes sans ` | openssl rsa`. Je suppose qu'OpenSSH et d'autres utilitaires qui utilisent le fichier d'identité peuvent gérer ce "cruft" (je n'ai pas essayé), mais je suis simplement habitué à ne fournir que les données nécessaires et rien de plus, surtout si c'est quelque chose autour de la sécurité.

1 votes

Cette réponse m'a permis d'accéder à la clé privée au format PEM dans le terminal, que j'ai pu copier/coller : openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts

10voto

Ali Alimohammadi Points 160

Solution 1 :

Extraire P12 de jks

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

Extraire PEM du fichier P12 et Edit et pem du fichier crt

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

Extraire la clé de jks

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

Solution 2 :

Extraire PEM et encryptedPrivateKey dans un fichier txt```.

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

Déchiffrer la clé privée

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key

1 votes

Lorsque vous répondez à des questions, il est utile de souligner ce que sont les commandes. Vous pouvez le faire en ajoutant trois guillemets avant et après la commande, ainsi "echo hello" devient echo hello .

2voto

gvlax Points 169

Mise à jour : J'ai remarqué que ma réponse n'était qu'une mauvaise reproduction d'une question bien expliquée sur https://unix.stackexchange.com/... par BryKKan

En voici un extrait :

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>

3 votes

L'ajout de quelques explications rendrait cette réponse plus utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X