Conversione del certificato PKCS # 12 in PEM utilizzando OpenSSL


223

Ho OpenSSL x64 su Windows 7 che ho scaricato da openssl-for-windows su Google Code . Sto tentando di eseguire:

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

ma ricevo un errore.

unable to load private key

Come estraggo il certificato in PEM dall'archivio PKCS # 12 utilizzando OpenSSL?


@jww Penso che, dato che questa domanda ha più di 3 anni, sia un po 'tardi per segnalare la bandiera fuori tema.
Dean MacGregor

Solo una formalità così la gente sa che è fuori tema. Le persone fanno le stesse domande fuori tema e citano questa domanda. Se alle persone non viene detto che è fuori tema, continueranno a chiedere su Stack Overflow.
jww

2
@jww la risposta con il punteggio più alto sulla meta domanda che colleghi dice "Le domande DevOps dovrebbero essere consentite su Stack Overflow". Io upvote, perché la risposta soddisfatto le mie esigenze (anche se, per me, non ero programmazione, ho potuto facilmente incorporare la risposta in un programma se avrei voluto)
dcorking

Risposte:


566

Provare:

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

Dopo di che hai:

  • certificato in newfile.crt.pem
  • chiave privata in newfile.key.pem

Per inserire il certificato e la chiave nello stesso file senza una password, utilizzare quanto segue, poiché una password vuota farà sì che la chiave non venga esportata:

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

Oppure, se desideri fornire una password per la chiave privata, ometti -nodese inserisci una password:

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

Se è necessario inserire la password PKCS # 12 direttamente dalla riga di comando (ad esempio uno script), è sufficiente aggiungere -passin pass:${PASSWORD}:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'

2
È possibile che la chiave privata e il certificato vengano archiviati nello stesso file * .pem?
Ramis

20
sì, è:openssl pkcs12 -in path.p12 -out newfile.pem
Gee-Bee

2
chiedendo la password di importazione. Cos'è quello ?
Saurabh Chandra Patel

4
@SaurabhChandraPatel devi conoscere la password per il tuo certificato. Questo non è un mezzo per recuperare una password dimenticata
Dean MacGregor

3
omettendo -nodes, la chiave privata non viene estratta.
Meixner

22

Devi solo fornire una password. Puoi farlo dalla stessa riga di comando con la seguente sintassi:

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

Ti verrà quindi richiesta una password per crittografare la chiave privata nel file di output. Includere l'opzione "nodi" nella riga sopra se si desidera esportare la chiave privata non crittografata (testo normale):

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

Maggiori informazioni: http://www.openssl.org/docs/apps/pkcs12.html


16

Se puoi usare Python, è ancora più semplice se hai il pyopensslmodulo. Ecco qui:

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())

C'è qualche motivo per aprire il file usando filee no open? Voglio solo capirlo perché lo userò in futuro (per semplificare la mia soluzione chiamando openssh come comando)
Jan Vlcinsky

No, nessuna differenza. Puoi solo farlo open("push.p12", 'rb').read().
KVISH

2
Se usi python 3 probabilmente vorrai scrivere il contenuto su file: with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))per scrivere il certificato e with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))per la chiave.
Adam Parkin

Sto usando python 3.7, quando eseguo l'esempio precedente, ottengo quanto segue: "TypeError: l'inizializzatore per ctype 'char' deve essere un byte di lunghezza 1, non str" C'è qualcosa che non va nella mia password
getaglow

Perché è "ancora più facile" creare un file, inserire il codice, salvarlo ed eseguirlo, piuttosto che eseguire un solo comando?
Torben Gundtofte-Bruun

3

Avevo un file PFX e avevo bisogno di creare il file KEY per NGINX, quindi ho fatto questo:

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

Quindi ho dovuto modificare il file KEY e rimuovere tutto il contenuto fino a -----BEGIN PRIVATE KEY-----. Dopo di che NGINX ha accettato il file KEY.


-1

Se hai bisogno di un file PEM senza password, puoi utilizzare questa soluzione.

Basta copiare e incollare la chiave privata e il certificato nello stesso file e salvarli come .pem.

Il file sarà simile a:

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

Questo è l'unico modo che ho trovato per caricare i certificati sui dispositivi Cisco per HTTPS.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.