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?

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.


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.

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 <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;

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

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.


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.


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

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


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.


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.


-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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.