Antworten:
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.
/etc/ssl/certs/ca-certificates.crt
und bekamunable to load PKCS7 object
Java 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 automatisch die Vertrauenskette aus dem integrierten Zertifikatspeicher.
Ergebnisse:
.crt
Datei werden nicht angezeigt.crt
Datei. Dies kann zu falschen Schlussfolgerungen führen.Das Befolgen dieser FAQ führte mich zu diesem Perl-Skript , das mir sehr nahe legt, dass openssl
es 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 <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;
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
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.
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.
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
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.
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 }'
.
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.
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.
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
openssl
Aufruf 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.