Conversion du certificat PKCS # 12 en PEM à l'aide d'OpenSSL

212

J'ai OpenSSL x64 sur Windows 7 que j'ai téléchargé depuis openssl-for-windows sur Google Code . J'essaie d'exécuter:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" 

mais je reçois une erreur.

unable to load private key

Comment extraire le certificat dans PEM du magasin PKCS # 12 à l'aide d'OpenSSL?

Dean MacGregor
la source
@jww Je pense qu'étant donné que cette question a plus de 3 ans, il est un peu tard pour signaler le drapeau hors sujet.
Dean MacGregor
Juste une formalité pour que les gens connaissent son hors-sujet. Les gens posent les mêmes questions hors sujet et citent cette question. Si les gens ne sont pas informés de son hors-sujet, ils continueront à demander sur Stack Overflow.
JWW
2
@jww, la réponse la plus votée à la méta-question que vous liez indique que "les questions DevOps devraient être autorisées sur Stack Overflow". Je vais voter, parce que la réponse a répondu à mes besoins (bien que, pour moi, je ne programmais pas, je pourrais facilement intégrer la réponse dans un programme si je le souhaitais)
dcorking

Réponses:

538

Essayer:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes

Après cela, vous avez:

  • certificat dans newfile.crt.pem
  • clé privée dans newfile.key.pem

Pour mettre le certificat et la clé dans le même fichier, utilisez ce qui suit

openssl pkcs12 -in path.p12 -out newfile.pem

Si vous devez saisir le mot de passe PKCS # 12 directement à partir de la ligne de commande (par exemple un script), ajoutez simplement -passin pass:${PASSWORD}:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'
kmx
la source
2
Est-il possible que la clé privée et le certificat soient stockés dans le même fichier * .pem?
Ramis
18
oui, c'est:openssl pkcs12 -in path.p12 -out newfile.pem
Gee-Bee
2
demande de mot de passe d'importation. Qu'est-ce que c'est ?
Saurabh Chandra Patel,
4
@SaurabhChandraPatel, vous devez connaître le mot de passe de votre certificat. Ce n'est pas un moyen de récupérer un mot de passe oublié
Dean MacGregor
2
en omettant -nodes, la clé privée n'est pas extraite.
Meixner
22

Il vous suffit de fournir un mot de passe. Vous pouvez le faire dans la même ligne de commande avec la syntaxe suivante:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password]

Vous serez alors invité à entrer un mot de passe pour crypter la clé privée dans votre fichier de sortie. Incluez l'option "nœuds" dans la ligne ci-dessus si vous souhaitez exporter la clé privée non chiffrée (texte en clair):

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password] -nodes

Plus d'informations: http://www.openssl.org/docs/apps/pkcs12.html

Colin
la source
16

Si vous pouvez utiliser Python, c'est encore plus facile si vous avez le pyopensslmodule. C'est ici:

from OpenSSL import crypto

# May require "" for empty password depending on version

with open("push.p12", "rb") as file:
    p12 = crypto.load_pkcs12(file.read(), "my_passphrase")

# PEM formatted private key
print crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

# PEM formatted certificate
print crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())
KVISH
la source
Y a-t-il une raison d'ouvrir le fichier en utilisant fileet non open? Je veux juste le comprendre car je vais l'utiliser à l'avenir (pour simplifier ma solution en appelant openssh comme commande)
Jan Vlcinsky
Non, aucune différence. Vous pouvez simplement faire open("push.p12", 'rb').read().
KVISH
2
Si vous utilisez python 3, vous voudrez probablement écrire le contenu dans des fichiers: with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))pour écrire le certificat et with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))pour la clé.
Adam Parkin
J'utilise python 3.7, lorsque j'exécute l'exemple ci-dessus, j'obtiens ce qui suit: "TypeError: l'initialiseur pour le type 'char' doit être un octet de longueur 1, pas str" Y a-t-il un problème avec mon mot de passe
getaglow
Pourquoi est-il "encore plus facile" de créer un fichier, d'entrer le code, de l'enregistrer et de l'exécuter - plutôt que d'exécuter une seule commande?
Torben Gundtofte-Bruun
3

J'avais un fichier PFX et j'avais besoin de créer un fichier KEY pour NGINX, alors j'ai fait ceci:

openssl pkcs12 -in file.pfx -out file.key -nocerts -nodes

Ensuite, j'ai dû modifier le fichier KEY et supprimer tout le contenu jusqu'à -----BEGIN PRIVATE KEY-----. Après cela, NGINX a accepté le fichier KEY.

KTCO
la source
0

Si vous avez besoin d'un fichier PEM sans mot de passe, vous pouvez utiliser cette solution.

Copiez et collez simplement la clé privée et le certificat dans le même fichier et enregistrez-le au format .pem.

Le fichier ressemblera à:

-----BEGIN PRIVATE KEY-----
............................
............................
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...........................
...........................
-----END CERTIFICATE-----

C'est le seul moyen que j'ai trouvé pour télécharger des certificats sur des appareils Cisco pour HTTPS.

yeya
la source