Hinweis: Dies ist keine wirkliche Frage, da ich die Antwort bereits gefunden habe. Da ich sie hier jedoch nicht leicht gefunden habe, werde ich sie veröffentlichen, damit andere davon profitieren können.
Frage: Wie liest man eine verkettete PEM-Datei, wie sie von der Anweisung SSLCACertificateFile für Apache / mod_ssl verwendet wird ?
Antwort (Original) ( Quelle ):
cat $file|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'
Dies kann eine leere Datei hinterlassen, wenn am Ende eine leere Zeile steht, z. B. mit openssl pkcs7 -outform PEM -in my-chain-file -print_certs
. Um dies zu verhindern, überprüfen Sie die Länge der Zeile vor dem Drucken:
cat $file|awk 'split_after==1{n++;split_after=0}
/-----END CERTIFICATE-----/ {split_after=1}
{if(length($0) > 0) print > "cert" n ".pem"}'
Antwort 29.03.2016 :
Nach @slugchewer Antwort , csplit
könnte eine klarere Option sein mit:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
openssl
, für deren Analyse beispielsweise ein Zertifikat erforderlich ist.Antworten:
Das awk-Snippet dient zum Extrahieren der verschiedenen Teile, aber Sie müssen noch wissen, welcher Abschnitt der Schlüssel / das Zertifikat / die Kette ist. Ich musste einen bestimmten Abschnitt extrahieren und fand diesen in der OpenSSL-Mailingliste: http://openssl.6102.n7.nabble.com/Convert-pem-to-crt-and-key-files-tp47681p47697.html
quelle
Dies wurde zuvor auf StackOverflow beantwortet :
Edit 29/03/2016 : Siehe @slugchewer Antwort
quelle
Der
split
Befehl ist auf den meisten Systemen verfügbar, und sein Aufruf ist wahrscheinlich leichter zu merken.Wenn Sie eine Datei haben
collection.pem
, die Sie inindividual-*
Dateien aufteilen möchten , verwenden Sie:Wenn Sie nicht haben
split
, können Sie versuchencsplit
:quelle
-p
Option (oder die von mir gelesenen Hilfeseiten) beim Teilen an. Vielleicht verwenden Sie eine spezielle Binärdatei / ein spezielles Paketcsplit
stattdessen versuchen ... (siehe oben bearbeiten)csplit
!csplit: *}: bad repetition count
(aber split scheint zu funktionieren)Wenn Sie ein einzelnes Zertifikat aus einem PEM-Paket mit mehreren Zertifikaten erhalten möchten, versuchen Sie Folgendes:
openssl
Befehle verarbeiten eine PEM-Datei und spucken sie vor jedem Zertifikat mit vorangestellten"subject:"
und"issuer:"
Zeilen aus. Wenn Ihre PEM bereits so formatiert ist, brauchen Sie nur den letztenawk
Befehl.source1 , source2
quelle
Erwähnenswert ist auch, dass PEM-Dateien nur eine Sammlung von Schlüsseln / Zertifikaten in
BEGIN
/END
Blöcken sind. Es ist also ziemlich einfach, sie nur auszuschneiden / einzufügen, wenn es sich nur um eine einzelne Datei mit ein oder zwei interessanten Entitäten handelt.quelle
Wenn Sie Vollkettenzertifikate (dh solche, die von letsencrypt / certbot usw. generiert wurden) verarbeiten, die eine Verkettung des Zertifikats und der Zertifizierungsstellenkette darstellen, können Sie die Bash-String-Manipulation verwenden.
Beispielsweise:
So extrahieren Sie das Zertifikat und die Zertifizierungsstellenkette in Variablen:
Erläuterung:
Anstatt awk oder openssl (leistungsstarke Tools, die jedoch nicht immer verfügbar sind, z. B. in Docker Alpine-Bildern) zu verwenden, können Sie die Bash-String-Manipulation verwenden.
"${FULLCHAIN%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
: Am Ende des Inhalts von FULLCHAIN wird die längste Teilstring-Übereinstimmung zurückgegeben, und anschließend wird die Konkretisierung ausgeführt, sobald-----END CERTIFICATE-----
sie entfernt wird. Das*
stimmt mit allen Zeichen nach überein-----END CERTIFICATE-----
.$(echo -e "${FULLCHAIN#*-----END CERTIFICATE-----}" | sed '/./,$!d')
: Geben Sie vom Anfang des Inhalts von FULLCHAIN die kürzeste Teilzeichenfolgenübereinstimmung zurück und entfernen Sie dann die führenden neuen Zeilen. Ebenso*
stimmt das mit allen Zeichen vorher überein-----END CERTIFICATE-----
.Für eine schnelle Referenz (während Sie mehr über String - Manipulation in bash finden hier ):
${VAR#substring}
= der kürzeste Teilstring vom Anfang des Inhalts von VAR${VAR%substring}
= der kürzeste Teilstring vom Ende des Inhalts von VAR${VAR##substring}
= der längste Teilstring vom Anfang des Inhalts von VAR${VAR%%substring}
= die längste Teilzeichenfolge vom Ende des Inhalts von VARquelle
Hmmm ... fast genauso wie ich die Lösung vorbereitet habe (wie von @Cerber vorgeschlagen), ohne zu bemerken, dass diese Situation anscheinend viele Menschen haben. Meine Lösung folgt fast der gleichen Logik, verwendet jedoch einige grundlegendere Befehle:
Meine alle Zertifikate sind in Datei:
certin.pem
Dies schreibt im Grunde genommen so lange in eine Datei, bis "END" angezeigt wird, und beginnt dann schrittweise mit dem Schreiben in eine andere Datei. Auf diese Weise erhalten Sie "N" Anzahl von Ausgabedateien ( certout0.pem, certout1.pem usw.), je nachdem, wie viele Zertifikate sich in Ihrer Eingabe-PEM-Datei ( certin.pem ) befinden.
quelle