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.