Odpowiedzi:
http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 sugeruje ten jeden wiersz:
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
To rzeczywiście działało dla mnie, ale nie rozumiem szczegółów, więc nie mogę powiedzieć, czy są jakieś zastrzeżenia.
/etc/ssl/certs/ca-certificates.crt
i dostałemunable to load PKCS7 object
Java keytool
robi lewę:
keytool -printcert -v -file <certs.crt>
Adnotacja: Podwójne kliknięcie w systemie Windows nie działa. Windows odczytuje tylko pierwszy certyfikat z magazynu kluczy i automatycznie rozszerza łańcuch zaufania z wbudowanego magazynu certyfikatów.
Wyniki:
.crt
pliku nie są wyświetlane.crt
pliku. Może to prowadzić do błędnych wniosków.W następstwie tego FAQ doprowadziły mnie do tego skryptu perla , która bardzo silnie sugeruje mi, że openssl
nie ma natywne wsparcie dla obsługi n th certyfikatu w wiązce, a zamiast tego musimy użyć innego narzędzia do krojenia i-Dice wejście przed karmieniem każdy certyfikat dla openssl
. Wydaje się, że ten skrypt perla, swobodnie dostosowany do skryptu Nicka Burcha, do którego odsyłam powyżej:
#!/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, który wyświetla podsumowanie każdego certyfikatu w pliku.
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout
(podobny komandos wspomniany w innej odpowiedzi, ale daje to krótszy wynik, bez opcji --text).
przykład:
$ 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
To może nie być ładne ani eleganckie, ale było szybkie i działało dla mnie przy użyciu bash na Linuksie i bloków sformatowanych PEM w pliku pakietu ca-cert.
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
Możesz umieścić wszystko w jednym wierszu i dopasować opcje openssl do własnych potrzeb. Naprawdę chciałbym, aby istniało bardziej eleganckie rozwiązanie, ale w tym przypadku myślę, że znalezienie bardziej eleganckiego rozwiązania zajęłoby więcej czasu niż zhakowanie nieeleganckiego.
Ponieważ nie ma rozwiązania opartego na awk:
$ 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
Pierwsze polecenie podzieliło pakiet na certyfikaty, szukając linii BEGIN i END. Drugie polecenie zapętla wyodrębnione certyfikaty i pokazuje je.
Niewielka modyfikacja posta MadHatter, umożliwiająca kopiowanie / wklejanie bezpośrednio do interfejsu CLI. Dołączyłem również skrót MD5, który jest pomocny, gdy upewniam się, że certyfikaty są poprawne. Zwracana linia stdin jest skrótem md5 certyfikatów.
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
Jeśli chcesz zobaczyć krótkie, zwięzłe wyjście, skorzystaj z tej wersji. Pomocne, jeśli sprawdzasz tylko, czy podałeś wszystkie swoje certyfikaty, ale tak naprawdę nie sprawdzasz użycia / etc certyfikatów.
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
Na wypadek gdyby twoja wersja openssl nie obsługiwała wszystkich tych flag, możesz użyć egrep. To samo, co pierwsza, ale po prostu potok do egrep.
perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"
Aby sprawdzić skrót MD5 klucza prywatnego, możesz wykonać następujące czynności.
openssl rsa -noout -modulus -in privateKey.key | openssl md5
Odniesienie: SSL Shopper - Key Key Matcher
Oto rozwiązanie oparte na awk, które nie opiera się na plikach pośrednich.
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
Działa poprzez odczytywanie bloków PEM ze standardowego wejścia i łączenie każdego bloku do pojedynczej linii kodowanej base64. Linie są następnie odczytywane, dekodowane i przekazywane do openssl jako certyfikaty zakodowane w DER.
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 }'
.
Chciałbym tu podać idiomatyczny wiersz perla:
perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem
Jeśli jest tekst, to nieco bardziej niezawodna poprawka:
perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem
Wystarczy zmienić wartość n, która powinna być w drugiej instrukcji, aby uzyskać n-ty certyfikat.
Jednym ze sposobów zobaczenia całego łańcucha jest (oczywiście w systemie Windows) dwukrotne kliknięcie crt, a następnie spojrzenie na kartę Ścieżka certyfikacji. Pokaże cały łańcuch, nawet jeśli jest tylko Pośredni lub Certyfikat główny. Zobacz zrzut ekranu poniżej, aby uzyskać szczegółowe informacje. Jeśli nie korzystasz z systemu Windows, przepraszam za brak wiedzy na temat wariantów Unix / Linux.
Uwaga: może to powodować fałszywe wyniki, jeśli certyfikat pośredni znajduje się w lokalnym magazynie kluczy. System Windows doda go automatycznie i nie pokaże tylko tego, co było w pakiecie.
Przeoczyłem twoje początkowe polecenie i masz jedną rzecz nie na miejscu. Twoje polecenie powinno wyglądać następująco:
openssl x509 -in bundle.crt -noout -text
Źródło: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html
openssl
wywołanie spowodowało błąd składniowy, ale że wymieniono tylko pierwszy certyfikat w pakiecie. Po drugie, oba wywołania są funkcjonalnie identyczne. Po trzecie i chyba najważniejsze, twoje też nie działa, przynajmniej dla mnie; zawiera również tylko pierwszy certyfikat w pakiecie.