Jak wyświetlić wszystkie certyfikaty ssl w pakiecie?

101

Mam plik .crt pakietu certyfikatów.

robi openssl x509 -in bundle.crt -text -noouttylko pokazuje certyfikat główny.

jak mogę zobaczyć wszystkie inne certyfikaty?

pdeva
źródło

Odpowiedzi:

120

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.

Beni Cherniavsky-Paskin
źródło
9
To najlepsza odpowiedź - nawet nie opublikuję mojego rozwiązania nadmiernego zabijania Pythona! Pomiń „-tekst”, aby uzyskać informacje o temacie / wystawcy dla każdego certyfikatu.
Chris Wolf
Wypróbowałem /etc/ssl/certs/ca-certificates.crti dostałemunable to load PKCS7 object
OrangeDog
1
Czy nie dotyczy to formatu pkcs7, podczas gdy pytanie dotyczy pakietów w formacie x509?
Yetanotherjosh
3
Używa tylko pkcs7 jako pośredniego. Dane wejściowe są połączone PEM.
Beni Cherniavsky-Paskin
Jesteś super!!!
Jingguo Yao
21

Java keytoolrobi 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:

  1. Wszystkie poza pierwszym certyfikatem w .crtpliku nie są wyświetlane
  2. Może pojawić się inny łańcuch zaufania niż w .crtpliku. Może to prowadzić do błędnych wniosków.
Jan Wunderlich
źródło
Dzięki za wyjaśnienie kwestii Windows. To było naprawdę mylące do diabła ze mną
Nick.McDermaid
21

W następstwie tego FAQ doprowadziły mnie do tego skryptu perla , która bardzo silnie sugeruje mi, że opensslnie 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 <[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;
Szalony Kapelusznik
źródło
10

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
harmv
źródło
To wymaga lepszego wyjaśnienia
Sven
3

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.

użytkownik2856925
źródło
3

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.

Raghu Dodda
źródło
1
Funkcja przekierowania wydruku w awk jest dostępna w gawk i nawk, ale nie w podstawowym awk. I tak to działałoby na Linuksie (gawk jest połączone jako awk), ale może nie działać na OS X, który ma podstawowy awk.
Raghu Dodda,
1

W bash zwykle potrzebny jest tylko jeden (długi) wiersz kodu :-)

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

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

Lavermil
źródło
0

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.

Joe
źródło
2
Tak dla zabawy: 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

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.

Gerard ONeill
źródło
-2

Metoda Windows

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.

                                      wprowadź opis zdjęcia tutaj

Linux (metoda Ubuntu)

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

Brad Bouchard
źródło
Naprawdę? Wiem, że to subtelne, ale naprawdę nie możesz powiedzieć? My is openssl x509 -in bundle.crt -noout -text, podczas gdy twój ma -text -noout ... dlatego prawdopodobnie pojawia się błąd składniowy.
Brad Bouchard,
20
Trzymaj swoje konie, Brad. Po pierwsze, OP nie narzekał, że jego opensslwywoł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.
MadHatter,
Tak, nie jestem po stronie Ubuntu w takich sprawach i myślałem, że jest na Windowsie, dopóki mi nie powiedział inaczej. Nie chciałem więc pozostawiać OP zawieszonego, a po krótkim wyszukiwaniu odkryłem, że strona referencyjna dla tego typu poleceń zawiera listę poleceń, które mu dałem (ta z nieco inną składnią) i chciałam sprawdzić, czy może Wsparcie. Twoje punkty są zajęte, ale proszę, zrób to z większą łaską następnym razem.
Brad Bouchard,