Konvertieren des PKCS # 12-Zertifikats in PEM mithilfe von OpenSSL

212

Ich habe OpenSSL x64 unter Windows 7, das ich von openssl-for-windows unter Google Code heruntergeladen habe . Ich versuche zu rennen:

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

aber ich bekomme einen Fehler.

unable to load private key

Wie extrahiere ich das Zertifikat in PEM mit OpenSSL aus dem PKCS # 12-Speicher?

Dean MacGregor
quelle
@jww Ich denke, angesichts der Tatsache, dass diese Frage älter als 3 Jahre ist, ist es etwas spät, die Off-Topic-Flagge zu signalisieren.
Dean MacGregor
Nur eine Formalität, damit die Leute wissen, dass sie nicht zum Thema gehört. Die Leute stellen dieselben Fragen außerhalb des Themas und zitieren diese Frage. Wenn den Leuten nicht gesagt wird, dass sie nicht zum Thema gehören, werden sie weiterhin nach dem Stapelüberlauf fragen.
JWW
2
@jww Die am höchsten bewertete Antwort auf die von Ihnen verlinkte Meta-Frage lautet "DevOps-Fragen sollten bei Stapelüberlauf zulässig sein." Ich werde abstimmen, weil die Antwort meinen Bedürfnissen entsprach (obwohl ich für mich nicht programmierte, konnte ich die Antwort leicht in ein Programm integrieren, wenn ich wollte)
dcorking

Antworten:

534

Versuchen:

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

Danach haben Sie:

  • Zertifikat in newfile.crt.pem
  • privater Schlüssel in newfile.key.pem

Verwenden Sie Folgendes, um das Zertifikat und den Schlüssel in derselben Datei abzulegen

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

Wenn Sie das PKCS # 12-Kennwort direkt über die Befehlszeile eingeben müssen (z. B. ein Skript), fügen Sie einfach Folgendes hinzu -passin pass:${PASSWORD}:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'
kmx
quelle
2
Ist es möglich, dass privater Schlüssel und Zertifikat in derselben * .pem-Datei gespeichert werden?
Ramis
18
Ja, es ist:openssl pkcs12 -in path.p12 -out newfile.pem
Gee-Bee
2
Fragen Sie nach dem Import-Passwort. was ist das ?
Saurabh Chandra Patel
4
@SaurabhChandraPatel Sie müssen das Passwort für Ihr Zertifikat kennen. Dies ist kein Mittel, um ein vergessenes Passwort wiederherzustellen
Dean MacGregor
2
Wenn Sie -nodes weglassen, wird der private Schlüssel nicht extrahiert.
Meixner
22

Sie müssen nur ein Passwort eingeben. Sie können dies in derselben Befehlszeile mit der folgenden Syntax tun:

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

Sie werden dann aufgefordert, ein Kennwort einzugeben, um den privaten Schlüssel in Ihrer Ausgabedatei zu verschlüsseln. Fügen Sie die Option "Knoten" in die obige Zeile ein, wenn Sie den privaten Schlüssel unverschlüsselt (Klartext) exportieren möchten:

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

Weitere Informationen: http://www.openssl.org/docs/apps/pkcs12.html

Colin
quelle
16

Wenn Sie Python verwenden können, ist es noch einfacher, wenn Sie das pyopensslModul haben. Hier ist es:

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
quelle
Gibt es einen Grund, die Datei mit fileund nicht zu öffnen open? Ich möchte es nur verstehen, da ich es in Zukunft verwenden werde (um meine Lösung zu vereinfachen, indem ich openssh als Befehl aufrufe)
Jan Vlcinsky
Nein, kein Unterschied. Du kannst es einfach tun open("push.p12", 'rb').read().
KVISH
2
Wenn Sie Python 3 verwenden, möchten Sie wahrscheinlich den Inhalt in Dateien with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))schreiben : um das Zertifikat und with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))den Schlüssel zu schreiben .
Adam Parkin
Ich verwende Python 3.7. Wenn ich das obige Beispiel ausführe, wird Folgendes angezeigt: "TypeError: Der Initialisierer für den Typ 'char' muss ein Byte der Länge 1 sein, nicht str." Stimmt etwas mit meinem Kennwort nicht
getaglow
Warum ist es "noch einfacher", eine Datei zu erstellen, den Code einzugeben, zu speichern und auszuführen - anstatt nur einen einzigen Befehl auszuführen?
Torben Gundtofte-Bruun
3

Ich hatte eine PFX-Datei und musste eine KEY-Datei für NGINX erstellen, also habe ich Folgendes getan:

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

Dann musste ich die KEY-Datei bearbeiten und den gesamten Inhalt bis zu entfernen -----BEGIN PRIVATE KEY-----. Danach akzeptierte NGINX die KEY-Datei.

KTCO
quelle
0

Wenn Sie eine PEM-Datei ohne Kennwort benötigen, können Sie diese Lösung verwenden.

Kopieren Sie einfach den privaten Schlüssel und das Zertifikat, fügen Sie ihn in dieselbe Datei ein und speichern Sie ihn als .pem.

Die Datei sieht folgendermaßen aus:

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

Nur so konnte ich Zertifikate für HTTPS auf Cisco-Geräte hochladen.

yeya
quelle