it-swarm.com.de

Wie kann ich alle SSL-Zertifikate in einem Bundle anzeigen?

Ich habe eine .crt-Datei für das Zertifikatspaket.

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

wie sehe ich alle anderen Zertifikate?

118
pdeva

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 bei mir funktioniert, aber ich verstehe die Details nicht und kann daher nicht sagen, ob es irgendwelche Einschränkungen gibt.

Javas keytool macht den Trick:

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

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

Ergebnisse:

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

Das Folgen von diese FAQ führte mich zu diesem Perl-Skript , was mir sehr stark nahe legt, dass openssl keine native Unterstützung für den Umgang mit dem hat nth Zertifikat in einem Bundle, und stattdessen müssen wir ein Tool verwenden, um die Eingabe in Scheiben zu schneiden und zu würfeln, bevor wir jedes Zertifikat openssl zuführen. Dieses Perl-Skript, das frei aus dem oben verlinkten Skript von Nick Burch übernommen 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;
22
MadHatter

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

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

(Ähnliches Kommando in anderer Antwort erwähnt, 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
15
harmv

Das mag nicht schön 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 in eine Zeile setzen und die openssl-Optionen 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 zu hacken.

4
user2856925

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

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

3
Raghu Dodda

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
2
Marco

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

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

Wenn es Text gibt, dann eine etwas robustere Optimierung:

 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.

1
Gerard ONeill

Kleine Änderung an MadHatters Beitrag, 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 Standardzeile 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 schöne, kurze, prägnante 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/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 hier ein egrep verwenden. Das Gleiche wie beim ersten, aber nur 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, haben Sie folgende Möglichkeiten.

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

Referenz: SSL Shopper - Certificate Key Matcher

0
lavermil

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

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 aus stdin gelesen und jeder Block mit einer einzelnen Base64-codierten Zeile verkettet werden. Die Zeilen werden dann gelesen, decodiert und als DER-codierte Zertifikate an openssl übergeben.

0
Joe