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

194

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

En ce moment, je génère des clés via ssh-keygen que je mets .ssh/authorized_key, respectives quelque part du côté client.

À l'avenir, je veux utiliser les clés d'un PKCS#12conteneur, donc je dois d'abord extraire la clé publique PKCS#12, puis les mettre dans le .ssh/authorized_keysfichier. Y a-t-il une chance de faire fonctionner cela via openssl? Les clés sont-elles PKCS#12compatibles pour l'authentification ssh-public-key?

lazydaemon
la source

Réponses:

283

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
    
Nilesh
la source
7
les commandes fonctionnent, mais la clé privée est exportée au format PKCS1 et j'ai besoin de PKCS8 ... Y a-t-il une option qui me manque pour l'obtenir? Par exemple, il exporte '----- BEGIN RSA PRIVATE KEY -----' mais j'ai besoin de '----- BEGIN PRIVATE KEY -----'
edthethird
4
Pour ce faire, vous pouvez essayeropenssl rsa -in privateKey.pem -out private.pem
François
27
@edthethird: Pour obtenir PKCS8, ajoutez l'indicateur -nodes
Christopher K.
7
Pour exporter sans mot de passe, ajoutez -passout pass:. Il s'attend à ce que le paramètre soit sous la forme pass: mypassword. stackoverflow.com/a/27497899/206277
nidheeshdas
2
@ChristopherK. Merci! c'était le bon pour moi. l'ajout d' -nodesexporte la clé correctement
TecHunter
85

C'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
ryanc
la source
2
Je vous remercie! La première ligne était celle dont j'avais besoin. Juste la clé, non chiffrée, donc elle peut être installée via la plupart des systèmes automatisés CDN.
BTC le
1
@PhilipRego Je pense que vous avez confondu les clés publiques et privées. Une clé publique RSA est composée de deux valeurs, «e» l'exposant public et «n» le module - qui sont tous deux stockés le long des parties privées de la clé.
ryanc
17

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 fait passer du pays d'OpenSSL à 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 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

De toute évidence, l'écriture d'un mot de passe en texte brut sur la ligne de commande n'est pas non plus sûre, vous devez donc supprimer la dernière commande de l'historique ou simplement vous assurer qu'elle n'y arrive pas. Différents obus ont des manières différentes. Vous pouvez préfixer votre commande avec de l'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 }')

Alternativement, vous pouvez utiliser une manière différente de passer un mot de passe de clé privée à OpenSSL - consultez la 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
frzng
la source
À quoi | openssl rsaça sert?
Snekse
1
@Snekse 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 des «attributs» comme les attributs de sac sans «| openssl rsa`. Je suppose que OpenSSH et d'autres utilitaires qui utilisent un fichier d'identité peuvent gérer cette cruauté (je n'ai pas essayé), mais je suis simplement utilisé pour fournir uniquement les données nécessaires et rien de plus, surtout si c'est quelque chose autour de la sécurité.
frzng
1
Cette réponse a fonctionné pour moi pour avoir accès à la clé privée au format PEM dans le terminal, que j'ai pu copier / coller: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus
7

Solution 1:

Extraire P12 de jks

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

Extraire le PEM du P12 et éditer le fichier 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 en fichier txt ''

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

Déchiffrer privateKey

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key
Ali Alimohammadi
la source
1
Lorsque vous répondez à des questions, il est utile de souligner les commandes. Vous pouvez le faire en ajoutant trois guillemets avant et après la commande pour que `` echo hello`` devienne echo hello.
PatS
2

Mise à jour: j'ai remarqué que ma réponse n'était qu'un mauvais double 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>
gvlax
la source
3
L'ajout d'explications rendrait cette réponse plus utile.
mx0
0

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 du 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 ) afin de l'utiliser pour l'authentification ssh-public-key.

sirgeorge
la source
0

La réponse acceptée est la commande correcte, je veux juste ajouter une chose supplémentaire, lors de l'extraction de la clé si vous laissez le mot de passe PEM ( "Enter PEM pass phrase:") vide, la clé complète ne sera pas extraite mais uniquement lalocalKeyID sera extraite. 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 matière d'importation de mot de passe, vous pouvez spécifier le mot de passe réel "Enter Import Password:"ou laisser ce mot de passe vierge:

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
Arvind Sachdeva
la source
1
Ce devrait être un commentaire à la réponse acceptée, pas la réponse.
Styx