Wie zeige ich alle SSL-Zertifikate in einem Bundle an?

101

Ich habe eine CRT-Datei für das Zertifikatbündel.

Dabei wird openssl x509 -in bundle.crt -text -nooutnur das Stammzertifikat angezeigt.

Wie sehe ich alle anderen Zertifikate?

pdeva
quelle

Antworten:

120

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

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

Es hat in der Tat funktioniert, aber ich verstehe die Details nicht und kann daher nicht sagen, ob es irgendwelche Einschränkungen gibt.

Beni Cherniavsky-Paskin
quelle
9
Dies ist die beste Antwort - ich werde nicht einmal meine Over-Kill-Python-Lösung veröffentlichen! Lassen Sie den "-Text" weg, um nur die Betreff- / Ausstellerinformationen für jedes Zertifikat zu erhalten.
Chris Wolf
Versuchte es auf /etc/ssl/certs/ca-certificates.crtund bekamunable to load PKCS7 object
OrangeDog
1
Gilt das nicht für das pkcs7-Format, während es sich um Pakete im x509-Format handelt?
Yetanotherjosh
3
Es wird nur pkcs7 als Zwischenstufe verwendet. Eingang ist verkettetes PEM.
Beni Cherniavsky-Paskin
Du bist super!!!
Jingguo Yao
21

Java keytoolmacht den Trick:

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

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

Ergebnisse:

  1. Alle darüber hinausgehenden Zertifikate in der .crtDatei werden nicht angezeigt
  2. Möglicherweise wird eine andere Vertrauenskette angezeigt als in der .crtDatei. Dies kann zu falschen Schlussfolgerungen führen.
Jan Wunderlich
quelle
Vielen Dank für die Klärung der Windows-Sache. Das hat mich wirklich verwirrt
Nick.McDermaid
21

Das Befolgen dieser FAQ führte mich zu diesem Perl-Skript , das mir sehr nahe legt, dass openssles keine native Unterstützung für die Verarbeitung des n- ten Zertifikats in einem Bundle gibt und dass wir stattdessen ein Tool verwenden müssen, um die Eingabe vor dem Einziehen in Segmente aufzuteilen Zertifikat an openssl. Dieses Perl-Skript, das frei von dem oben verlinkten Skript von Nick Burch angepasst wurde, 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 <[email protected]>
# v0.0.2         Tom Yates <[email protected]>
#

$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;
MadHatter
quelle
10

Oneliner, der eine Zusammenfassung aller Zertifikate in der Datei anzeigt.

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

(Ähnliches Kommando, das in einer anderen Antwort erwähnt wurde, aber dies ergibt eine 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
harmv
quelle
Das braucht bessere Erklärungen
Sven
3

Dies mag nicht hübsch oder elegant sein, aber es war schnell und funktionierte für mich mit Bash unter 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 Optionen von openssl an Ihre Bedürfnisse anpassen. Ich wünschte wirklich, es gäbe eine elegantere Lösung dafür, aber in diesem Fall hätte es meiner Meinung nach mehr Zeit gekostet, die elegantere Lösung zu finden, als die unelegante herauszuhacken.

user2856925
quelle
3

Da es keine awk-basierte Lösung gibt:

$ 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

Das erste Befehlspaket wurde in Certs aufgeteilt, indem nach den Zeilen BEGIN und END gesucht wurde. Der zweite Befehl durchläuft die extrahierten Zertifikate und zeigt sie an.

Raghu Dodda
quelle
1
Die Druckumleitungsfunktion in awk ist in gawk und nawk verfügbar, jedoch nicht in basic awk. Und so würde dies unter Linux funktionieren (gawk ist als awk verknüpft), aber möglicherweise nicht unter OS X, das über grundlegende awk verfügt.
Raghu Dodda
1

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
Marco
quelle
0

Kleine Änderung am Beitrag von MadHatter, damit Sie direkt in die CLI kopieren / einfügen können. Ich habe auch den MD5-Hash eingefügt, der hilfreich ist, um sicherzustellen, dass die Zertifikate korrekt sind. Die zurückgegebene stdin-Zeile ist der md5-Hash der Zertifikate.

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, prägnante Ausgabe sehen möchten, verwenden Sie diese Version. Hilfreich, wenn Sie nur überprüfen, ob Sie alle Zertifikate enthalten haben, aber nicht wirklich die Verwendung / usw. 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 egrep verwenden. Das Gleiche wie das erste, aber einfach an egrep weiterleiten.

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

Gehen Sie folgendermaßen vor, um den MD5-Hash des privaten Schlüssels zu überprüfen.

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

Referenz: SSL Shopper - Certificate Key Matcher

Lavermil
quelle
0

Hier ist eine awk-basierte Lösung, die keine Zwischendateien benötigt.

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 durch Lesen von PEM-Blöcken aus stdin und Verketten jedes Blocks zu einer einzelnen Base64-codierten Zeile. Die Zeilen werden dann gelesen, dekodiert und als DER-kodierte Zertifikate an openssl übergeben.

Joe
quelle
2
Just for fun: 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
0

Ich möchte die idiomatische Perl-Kommandozeile hier einfügen:

  perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem

Wenn es Text gibt, dann ein etwas robusterer Tweak:

 perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem

Ändern Sie einfach den Wert von n in der zweiten Anweisung, um das n-te Zertifikat zu erhalten.

Gerard ONeill
quelle
-2

Windows-Methode

Eine Möglichkeit, wie Sie die gesamte Kette sehen können, besteht darin (unter Windows natürlich), auf das CRT zu doppelklicken und dann auf die Registerkarte "Zertifizierungspfad" zuzugreifen. Es wird die gesamte Kette angezeigt, auch wenn es nur ein Intermediate- oder Root-Zertifikat gibt. Siehe Screenshot unten für Details. Wenn Sie nicht unter Windows arbeiten, entschuldige ich mich für meine mangelnden Kenntnisse in Bezug auf 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 Bundle enthalten war.

                                      Bildbeschreibung hier eingeben

Linux (Ubuntu-Methode)

Ich habe dein erstes Kommando übersehen und du hast eine Sache falsch gemacht. Ihr Befehl sollte folgendermaßen aussehen:

openssl x509 -in bundle.crt -noout -text

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

Brad Bouchard
quelle
"Ja wirklich?" Ich weiß, dass es sublte ist, aber du kannst es wirklich nicht sagen? Mein ist openssl x509 -in bundle.crt -noout -text, während dein -text -noout hat ... daher kommt es wahrscheinlich zu einem Syntaxfehler.
Brad Bouchard
20
Halte deine Pferde, Brad. Erstens hat das OP nicht beanstandet, dass sein opensslAufruf einen Syntaxfehler verursacht hat, sondern dass nur das erste Zertifikat im Paket aufgeführt ist. Zweitens sind die beiden Aufrufe funktional identisch. Drittens, und wahrscheinlich am wichtigsten, funktioniert auch deins nicht, zumindest für mich; Auch hier wird nur das erste Zertifikat im Bundle aufgelistet.
MadHatter
Ja, ich bin bei solchen Problemen nicht so auf der Ubuntu-Seite und dachte, er wäre auf Windows, bis er mir etwas anderes sagte. Also wollte ich das OP nicht hängen lassen und nachdem ich ein bisschen gesucht hatte, stellte ich fest, dass eine Referenzseite für diese Arten von Befehlen den Befehl auflistete, den ich ihm gab (den mit der etwas anderen Syntax) und wollte sehen, ob es möglich war Hilfe. Ihre Punkte sind vergeben, aber bitte tun Sie es beim nächsten Mal mit mehr Anmut.
Brad Bouchard