So exportieren Sie die CA-Zertifikatkette aus PFX im PEM-Format ohne Bag-Attribute

So exportieren Sie die CA-Zertifikatkette aus PFX im PEM-Format ohne Bag-Attribute

Ich habe eine PKCS12-Datei, die die vollständige Zertifikatskette und den privaten Schlüssel enthält. Ich muss sie für eine Anwendung in 3 Dateien aufteilen. Die 3 Dateien, die ich brauche, sind die folgenden (im PEM-Format):

  • eine unverschlüsselte Schlüsseldatei
  • eine Client-Zertifikatsdatei
  • eine CA-Zertifikatsdatei (Root und alle Zwischenzertifikate)

Dies ist eine häufige Aufgabe, die ich ausführen muss, daher suche ich nach einer Möglichkeit, dies zu tun, ohne die Ausgabe manuell zu bearbeiten.

Ich habe Folgendes versucht:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes -out <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys -out <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain -out <cacerts.cer>

Dies funktioniert einwandfrei, die Ausgabe enthält jedoch Bag-Attribute, mit denen die Anwendung nicht umzugehen weiß.

Nach einigem Suchen fand ich einen Lösungsvorschlag, bei dem die Ergebnisse durch x509 geleitet werden, um die Bag-Attribute zu entfernen.

openssl x509 -in <clientcert.cer> -out <clientcert.cer>

Das funktioniert, aber ich habe ein Problem mit der Cacert-Datei. Die Ausgabedatei enthält nur eines der drei Zertifikate in der Kette.

Gibt es eine Möglichkeit, die Einbeziehung der Bag-Attribute in die Ausgabe des pkcs12-Befehls zu vermeiden, oder eine Möglichkeit, alle Zertifikate in die Ausgabe des x509-Befehls aufzunehmen? Wenn die Ausführung über x509 die einfachste Lösung ist, gibt es dann eine Möglichkeit, die Ausgabe von pkcs12 in x509 umzuleiten, anstatt die Datei zweimal auszugeben?

Antwort1

Die Lösung, die ich schließlich fand, bestand darin, es durch sed weiterzuleiten.

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>

Antwort2

Eine andere Lösung ohne sed:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | openssl pkcs8 -nocrypt -out <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | openssl x509 -out <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | openssl x509 -out <cacerts.cer>

Antwort3

Singleliner mit awk:

openssl pkcs12 -in key.pfx -nodes -out - | awk '/-----BEGIN/{a=1}/-----END/{print;a=0}a'

Dadurch wird die gesamte Ausgabe verworfen, die nicht zwischen den PEM-Beginn- und Endzeilen liegt. Der Verdienst für den AWK geht anhttps://stackoverflow.com/q/17988756#comment29487454_17988834

Antwort4

Habe gerade versucht, mit dem

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | openssl x509 -out <cacerts.cer>

um die Kette im Klartext ohne die Header für jedes Element in der Kette zu exportieren. Auf diesem Windows NT-Server wurde nur das erste Element der Kette exportiert, nicht die beiden Elemente, die ich erwartet hatte. Stattdessen habe ich einfach verwendet

openssl pkcs12 -in <filename.pfx> -cacerts -chain -nokeys -nodes -out <cacerts.cer>

und die Dateien mit Notepad bearbeiten, um den unerwünschten Text zu entfernen. Unelegant? Ja, aber es hat das gewünschte Ergebnis gebracht.

verwandte Informationen