Frage Wie sieht man alle SSL-Zertifikate in einem Bundle?


Ich habe eine Certificate-Bundle-.crt-Datei.

tun openssl x509 -in bundle.crt -text -noout zeigt nur das Stammzertifikat an.

Wie sehe ich alle anderen Zertifikate?


76
2018-04-23 18:15


Ursprung




Antworten:


http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 schlägt diesen One-Liner vor:

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout

Es funktionierte zwar für mich, aber ich verstehe die Details nicht, also kann ich nicht sagen, ob irgendwelche Vorbehalte bestehen.


88
2018-04-25 06:27



Das ist die beste Antwort - ich werde nicht einmal meine Python-Lösung veröffentlichen! Lassen Sie den "Text" weg, um nur die Betreff- / Ausstellerinformationen für jedes Zertifikat zu erhalten. - Chris Wolf
Anprobiert /etc/ssl/certs/ca-certificates.crt und hab unable to load PKCS7 object - OrangeDog
Ist das nicht für das pkcs7-Format, während sich die Frage nach x509-Formatbündeln richtet? - Yetanotherjosh
Es verwendet nur pkcs7 als Zwischenstufe. Eingabe ist verkettete PEM. - Beni Cherniavsky-Paskin
Du bist super!!! - Jingguo Yao


Folgend diese FAQ führte mich zu Dieses Perl-Skript, was mir sehr stark vorschlägt openssl hat keine native Unterstützung für die Handhabung der nth Zertifikat in einem Bündel, und stattdessen müssen wir ein Werkzeug verwenden, um die Eingabe zu zerlegen und zu würfeln, bevor wir jedes Zertifikat einspeisen openssl. Dieses Perl-Skript, frei nach dem oben verlinkten Skript von Nick Burch, scheint die Aufgabe zu erfüllen:

#!/usr/bin/perl
# script for splitting multi-cert input into individual certs
# Artistic Licence
#
# v0.0.1         Nick Burch <nick@tirian.magd.ox.ac.uk>
# v0.0.2         Tom Yates <tyates@gatekeeper.ltd.uk>
#

$filename = shift;
unless($filename) {
  die("You must specify a cert file.\n");
}
open INP, "<$filename" or die("Unable to load \"$filename\"\n");

$thisfile = "";

while(<INP>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo \'$thisfile\' | openssl x509 -noout -text`;
      $thisfile = "";
   }
}
close INP;

20
2018-03-27 13:29





Java's keytool macht den Trick:

keytool -printcert -v -file <certs.crt>

Anmerkung: Windows Doppelklick funktioniert nicht. Windows liest nur das erste Zertifikat im Keystore und erweitert die Vertrauensstellung automatisch aus dem integrierten Zertifikatspeicher.

Ergebnisse:

  1. Alles über das erste Zertifikat in der .crt Datei wird nicht angezeigt
  2. Möglicherweise wird eine andere Vertrauenskette angezeigt als in der .crt Datei. Dies kann zu falschen Schlussfolgerungen führen.

17
2017-09-03 07:18



Danke für die Klärung der Windows-Sache. Das war wirklich sehr verwirrend - Nick.McDermaid


Das mag nicht hübsch oder elegant sein, aber es war schnell und funktionierte für mich mit bash auf Linux und PEM-formatierten Blöcken in einer ca-cert Bundle-Datei.

while read line
do
    if [ "${line//END}" != "$line" ]; then
        txt="$txt$line\n"
        printf -- "$txt" | openssl x509 -subject -issuer -noout
        txt=""
    else
        txt="$txt$line\n"
    fi
done < /path/to/bundle/file

Sie können alles auf eine Zeile setzen und die OpenSSL-Optionen anpassen. Ich wünschte mir wirklich, es gäbe eine elegantere Lösung dafür, aber in diesem Fall hätte ich die elegantere Lösung mehr Zeit gebraucht, als die unelegante zu hacken.


3
2017-11-09 01:08





Da gibt es keine awk-basierte Lösung:

$ cat ca-bundle | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".extracted.crt" }'
$ ls *.extracted.crt | while read cert; do openssl x509 -in $cert -text -noout; done

Der erste Befehl teilt das Bündel in Zertifikate auf, indem nach BEGIN- und END-Zeilen gesucht wird. Der zweite Befehl durchläuft die extrahierten Zertifikate und zeigt sie an.


3
2018-04-19 06:55



Die Druckumleitungsfunktion in awk ist in gawk und nawk verfügbar, aber nicht in basic awk. Und so würde dies unter Linux funktionieren (gawk ist als awk verlinkt), aber möglicherweise nicht unter OS X, das grundlegende awk hat. - Raghu Dodda


Oneliner, die eine Zusammenfassung jedes Zertifikats in der Datei anzeigen.

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout

(Ähnliches Kommando in anderer Antwort erwähnt, aber das gibt kürzere Ausgabe, ohne die Option --text).

Beispiel:

$ openssl crl2pkcs7 -nocrl -certfile bundled.crt | openssl pkcs7 -print_certs -noout

subject=/C=NL/postalCode=5705 CN/L=City/street=Example 20/O=Foobar B.V./OU=ICT/OU=Wildcard SSL/CN=*.example.com
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA

subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority

subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
issuer=/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Roo

3
2017-09-23 09:21



Das braucht bessere Erklärungen - Sven♦


In bash wird normalerweise nur eine (lange) Codezeile benötigt :-)

tfile=$( mktemp -u ) && \
csplit -z -q -f "$tfile" bundle.crt  '/----BEGIN CERTIFICATE-----/' '{*}' && \
find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete

1
2017-10-23 00:59





Kleine Änderung an MadHatters Beitrag, damit Sie direkt in das CLI kopieren / einfügen können. Ich habe auch den MD5-Hash hinzugefügt, der hilfreich ist, um sicherzustellen, dass die Zertifikate korrekt sind. Die zurückgegebene Stdin-Zeile ist der md5-Hash des / der Cert (s).

perl -e 'my $thisfile = "";
foreach (<>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo "$thisfile" | openssl x509 -noout -text`;
      print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5`;
      $thisfile = "";
   }
}' < my_id_cert_and_ca_bundle.crt

Wenn Sie eine kurze, kurze Ausgabe sehen möchten, verwenden Sie diese Version. Hilfreich, wenn Sie nur überprüfen, ob Sie alle Ihre Zertifikate enthalten haben, aber nicht wirklich die Verwendung / etc der Zertifikate überprüfen.

perl -e 'my $thisfile = "";
foreach (<>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo "$thisfile" | openssl x509 -noout -serial -subject -dates -alias -issuer`;
      print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5` . "\n";
      $thisfile = "";
   }
}' < my_id_cert_and_ca_bundle.crt

Nur für den Fall, dass Ihre openssl-Version nicht alle diese Flags unterstützt, können Sie hier einige egrep verwenden. Das gleiche wie das erste, aber nur Pipe zu egrep.

perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"

Um den MD5-Hash des privaten Schlüssels zu überprüfen, können Sie Folgendes tun.

openssl rsa -noout -modul -in privateKey.key | openssl md5

Referenz: SSL Shopper - Zertifikatsschlüssel-Matcher


0
2018-02-08 09:18





Hier ist eine awk-basierte Lösung, die nicht auf Zwischendateien angewiesen ist.

cat bundle.crt | awk '{
  if ($0 == "-----BEGIN CERTIFICATE-----") cert=""
  else if ($0 == "-----END CERTIFICATE-----") print cert
  else cert=cert$0
}' | while read CERT; do
  echo "$CERT" | base64 -d | openssl x509 -inform DER -text -noout
done

Es funktioniert, indem PEM-Blöcke von stdin gelesen werden und jeder Block zu einer einzelnen base64-codierten Zeile verkettet wird. Die Zeilen werden dann gelesen, dekodiert und als DER-codierte Zertifikate an openssl übergeben.


0
2018-04-23 19:00



Nur zum Spaß: cat bundle.crt | awk -v cmd="openssl x509 -subject -noout" '/-----BEGIN/ { c = $0; next } c { c = c "\n" $0 } /-----END/ { print c|cmd; close(cmd); c = 0 }'. - Manav


Windows-Methode

Eine Möglichkeit, die gesamte Kette zu sehen, ist (in Windows natürlich), doppelklicken Sie auf den CRT und dann auf die Registerkarte Zertifizierungspfad. Es wird die gesamte Kette angezeigt, auch wenn es nur ein Intermediate oder Root Cert gibt. Siehe Screenshot unten für Details. Wenn Sie nicht unter Windows arbeiten, entschuldige ich mich für mein Unwissen mit Unix / Linux-Varianten.

Hinweis: Dies kann zu falschen Ergebnissen führen, wenn sich das Zwischenzertifikat in Ihrem lokalen Keystore befindet. Windows fügt es automatisch hinzu und zeigt nicht nur an, was im Paket enthalten war.

enter image description here

Linux (Ubuntu-Methode)

Ich habe deinen ursprünglichen Befehl übersehen und du hast eine Sache nicht richtig. Ihr Befehl sollte folgendermaßen aussehen:

openssl x509 -in bundle.crt -noout -text

Quelle: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html


-2



"Ja wirklich?" Ich weiß, es ist subtil, aber du kannst es wirklich nicht sagen? Mein ist openssl x509 -in bundle.crt -noout -text, während deins hat -text-noout ... deshalb erhalten Sie wahrscheinlich einen Syntaxfehler. - Brad Bouchard
Halte deine Pferde, Brad. Erstens hat sich das OP nicht darüber beschwert openssl Aufruf gab einen Syntaxfehler, aber es nur das erste Zertifikat in dem Paket aufgelistet. Zweitens sind die beiden Aufrufe funktional identisch. Drittens und wahrscheinlich am wichtigsten, deins funktioniert auch nicht, zumindest für mich; Es listet auch nur das erste Zertifikat im Bundle auf. - MadHatter
Ja, ich bin nicht so auf der Ubuntu-Seite der Dinge für Dinge wie diese und dachte, er war auf Windows, bis er mir etwas anderes sagte. Also wollte ich das OP nicht hängen lassen und nachdem ich ein wenig gesucht hatte, fand ich heraus, dass eine Referenzseite für diese Art von Befehlen den Befehl enthielt, den ich ihm gab (den mit der etwas anderen Syntax) und wollte sehen, ob es möglich war Hilfe. Deine Punkte sind vergeben, aber mach es beim nächsten Mal mit mehr Anmut. - Brad Bouchard