web-dev-qa-db-fra.com

Extraire la clé publique / privée du fichier PKCS12 pour une utilisation ultérieure dans l'authentification SSH-PK

Je souhaite extraire les clés publique et privée de mon fichier PKCS # 12 pour une utilisation ultérieure dans SSH-Public-Key-Authentication.

En ce moment, je génère des clés via ssh-keygen dans lequel je mets . Ssh/registered_key, respectivement quelque part du côté client.

À l'avenir, je souhaite utiliser les clés d'un conteneur PKCS # 12. Je dois donc extraire d'abord la clé publique de PKCS # 12, puis les placer dans le fichier . Ssh/registered_keys - . Y a-t-il une chance que cela fonctionne via openssl? Les clés de PKCS # 12 sont-elles compatibles avec l'authentification ssh-public-key?

177
lazydaemon

Vous pouvez utiliser les commandes suivantes pour extraire la 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
    
268
Nilesh

Ceci est possible avec un peu de conversion de format.

Pour extraire la clé privée dans un format openssh peut utiliser:

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 openssh peut utiliser:

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

OpenSSH ne peut pas utiliser les fichiers PKCS # 12 prêts à l'emploi. Comme d'autres l'ont suggéré, vous devez extraire la clé privée au format PEM, qui vous permet de quitter OpenSSL vers OpenSSH. Les autres solutions mentionnées ici ne fonctionnent pas pour moi. J'utilise OS X 10.9 Mavericks (10.9.3 pour le moment) avec des utilitaires "préemballé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 chiffrer 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 texte brut sur la ligne de commande n’est pas sûr non plus, vous devez donc supprimer la dernière commande de l’historique ou simplement vous assurer qu’elle n’y parvient pas. Différents coquillages ont différentes manières. Vous pouvez préfixer votre commande avec un espace pour l'empêcher d'être enregistrée dans l'historique dans Bash et 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 }')

Sinon, vous pouvez utiliser un moyen différent pour passer un mot de passe de clé privée à OpenSSL - consulter documentation OpenSSL pour les arguments de phrase secrète .

Ensuite, créez une clé publique OpenSSH pouvant être ajoutée au fichier allowed_keys:

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

Solution 1:

Extrait P12 de jks

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

Extraire le PEM du P12 et le fichier Edit et le 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écrypter privateKey

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

Mise à jour: J'ai remarqué que ma réponse n'était qu'un duplicata médiocre 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>
1
gvlax

La réponse acceptée est la bonne commande. Je souhaite simplement ajouter une chose supplémentaire lors de l'extraction de la clé si vous laissez le mot de passe PEM vide ("Entrez la phrase secrète PEM:"). être extrait. Pour obtenir la clé complète, vous devez spécifier un mot de passe PEM lors de l'exécution de la commande suivante.

Veuillez noter qu'en ce qui concerne le mot de passe d'importation, vous pouvez spécifier le mot de passe actuel pour "Entrer le mot de passe d'importation:" ou laisser ce mot de passe vide.

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
0
Arvind Sachdeva

Pour autant que je sache, PKCS # 12 n'est qu'un magasin de certificats/clés publiques/privées. Si vous avez extrait une clé publique d'un fichier PKCS # 12, OpenSSH devrait pouvoir l'utiliser tant qu'elle a été extraite au format PEM. Vous savez probablement déjà que vous avez également besoin d'une clé privée correspondante (également dans PEM) pour pouvoir l'utiliser pour l'authentification par ssh-public-key.

0
sirgeorge