Come visualizzare tutti i certificati SSL in un pacchetto?


102

Ho un file .crt di bundle di certificati.

fare openssl x509 -in bundle.crt -text -nooutmostra solo il certificato di root.

come posso vedere tutti gli altri certificati?

Risposte:


121

http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 suggerisce questo one-liner:

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout

In effetti ha funzionato per me, ma non capisco i dettagli, quindi non posso dire se ci sono avvertimenti.


9
Questa è la risposta migliore: non pubblicherò nemmeno la mia soluzione Python over-kill! Lasciare il "-testo" per ottenere informazioni sull'oggetto / emittente per ciascun certificato.
Chris Wolf,

/etc/ssl/certs/ca-certificates.crtunable to load PKCS7 object
Ho

1
Non è questo per il formato pkcs7, mentre la domanda riguarda i bundle in formato x509?
Yetanotherjosh,

3
Usa solo pkcs7 come intermedio. L'ingresso è PEM concatenato.
Beni Cherniavsky-Paskin,

Sei super!!!
Jingguo Yao,

22

Java keytoolfa il trucco:

keytool -printcert -v -file <certs.crt>

Annotazione: il doppio clic di Windows non funziona. Windows legge solo il primo certificato nel keystore ed estende automaticamente il trustchain dal suo archivio certificati incorporato.

risultati:

  1. Tutti oltre il primo certificato nel .crtfile non vengono visualizzati
  2. È possibile che venga visualizzata una trustchain diversa da quella presente nel .crtfile. Ciò può portare a conclusioni errate.

Grazie per aver chiarito la cosa di Windows. Questo mi ha davvero confuso
Nick.McDermaid l'

21

A seguito di questa FAQ mi ha portato a questo script perl , che suggerisce fortemente a me che opensslnon ha il supporto nativo per la gestione del n ° certificato in un fascio, e che invece dobbiamo usare qualche strumento per affettare-and-dice l'ingresso prima di alimentazione di ogni certificato a openssl. Questa sceneggiatura perl, liberamente adattata dalla sceneggiatura di Nick Burch collegata sopra, sembra fare il lavoro:

#!/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 che visualizza un riepilogo di ogni certificato nel file.

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout

(un comando simile menzionato in un'altra risposta, ma questo fornisce un output più breve, senza l'opzione --text).

esempio:

$ 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

Ciò richiede spiegazioni migliori
Sven

3

Questo potrebbe non essere carino o elegante, ma è stato veloce e ha funzionato per me usando bash su linux e blocchi formattati PEM in un file bundle 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

Puoi mettere tutto su una riga e regolare le opzioni di openssl per adattarle. Vorrei davvero che ci fosse una soluzione più elegante per questo, ma in questo caso penso che trovare la soluzione più elegante avrebbe richiesto più tempo rispetto a eliminare quella inelegante.


3

Poiché non esiste una soluzione basata su 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

Il primo comando ha diviso il bundle in certs cercando BEGIN e END lines. Il secondo comando scorre attraverso i certificati estratti e li mostra.


1
La funzione di reindirizzamento della stampa in awk è disponibile in gawk e nawk ma non in awk di base. Quindi, questo funzionerebbe su Linux (gawk è collegato come awk), ma potrebbe non su OS X che ha un awk di base.
Raghu Dodda,

1

In bash di solito è necessaria solo una (lunga) riga di codice :-)

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

0

Piccola modifica al post di MadHatter per consentire di copiare / incollare direttamente nella CLI. Ho anche incluso l'hash MD5, che è utile per assicurarsi che i certificati siano corretti. La linea stdin restituita è l'hash md5 dei certificati.

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

Se vuoi vedere un risultato breve e conciso, usi questa versione. Utile se stai solo verificando di aver incluso tutto il tuo certificato, ma non stai controllando realmente l'uso / ecc dei certificati.

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

Nel caso in cui la tua versione di openssl non supporti tutte quelle bandiere, ecco alcuni egrep che puoi usare. Stessa cosa della prima, ma solo pipe per egrep.

perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"

Per verificare l'hash MD5 della chiave privata è possibile effettuare le seguenti operazioni.

openssl rsa -noout -modulus -in privateKey.key | openssl md5

Riferimento: SSL Shopper - Certificate Key Matcher


0

Ecco una soluzione basata su awk che non si basa su file intermedi.

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

Funziona leggendo i blocchi PEM dallo stdin e concatenando ciascun blocco su una singola riga codificata base64. Le righe vengono quindi lette, decodificate e passate a openssl come certificati codificati DER.


2
Solo per divertimento: 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

Vorrei inserire la riga di comando idiomatica perl qui:

  perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem

Se c'è del testo, allora un tweak leggermente più robusto:

 perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem

Basta cambiare il valore di ciò che n dovrebbe essere nella seconda istruzione per ottenere l'ennesimo certificato.


-2

Metodo Windows

Un modo in cui puoi vedere l'intera catena è (ovviamente in Windows) fare doppio clic su crt e quindi guardare la scheda Percorso certificazione. Mostrerà l'intera catena anche se c'è solo un Intermedio, o Root Cert. Vedi screenshot di seguito per i dettagli. Se non sei su Windows, mi scuso per la mia mancanza di conoscenza con le varianti Unix / Linux.

Nota: questo può causare risultati falsi se il certificato intermedio si trova nel tuo keystore locale Windows lo aggiungerà automaticamente e non mostrerà solo ciò che era nel bundle.

                                      inserisci qui la descrizione dell'immagine

Linux (metodo Ubuntu)

Ho trascurato il tuo comando iniziale e hai una cosa fuori posto. Il tuo comando dovrebbe apparire così:

openssl x509 -in bundle.crt -noout -text

Fonte: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html


Veramente? So che è sublte ma non puoi davvero dirlo? My is openssl x509 -in bundle.crt -noout -text, mentre il tuo ha -text -noout ... quindi perché probabilmente stai riscontrando un errore di sintassi.
Brad Bouchard,

20
Tieni i tuoi cavalli, Brad. In primo luogo, l'OP non si è lamentato del fatto che la sua opensslinvocazione ha dato un errore di sintassi, ma ha elencato solo il primo certificato nel pacchetto. In secondo luogo, le due invocazioni sono funzionalmente identiche. In terzo luogo, e probabilmente soprattutto, il tuo non funziona, almeno per me; anch'esso elenca solo il primo certificato nel pacchetto.
MadHatter,

Sì, non sono all'altezza delle cose di Ubuntu per problemi come questo e ho pensato che fosse su Windows fino a quando non mi ha detto diversamente. Quindi non volevo lasciare l'OP sospeso e dopo aver fatto un po 'di ricerca ho scoperto che un sito di riferimento per questi tipi di comandi elencava il comando che gli avevo dato (quello con la sintassi leggermente diversa) e volevo vedere se poteva Aiuto. I tuoi punti sono presi, ma per favore fallo con più grazia la prossima volta.
Brad Bouchard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.