Come estrarre la CA principale e la CA secondaria da una catena di certificati in Linux?


25

Ho un certificato di entità / server che ha un certificato intermedio e radice. Quando ho catsul certificato entità finale, vedo solo un singolo BEGINe ENDtag. È l'unico certificato dell'entità finale.

Esiste un modo per visualizzare il contenuto del certificato intermedio e radice. Ho bisogno solo del contenuto BEGINe del ENDtag.

In Windows posso vedere l'intera catena di certificati dal "Percorso di certificazione". Di seguito è riportato l'esempio per il certificato di Stack Exchange.

inserisci qui la descrizione dell'immagine

Da lì posso eseguire un Visualizza certificato ed esportarli. Posso farlo sia per root che per intermedio in Windows. Sto cercando questo stesso metodo in Linux.

inserisci qui la descrizione dell'immagine


Per favore, dicci chi ti ha rilasciato quel certificato.
Rui F Ribeiro,

@RuiFRibeiro Diciamo a tutti ... Voglio vedere la catena di certificati per stackexchange con solo il certificato primario in mano.
Anirban Nag 'tintinmj',

Risposte:


25

Da un sito Web, puoi fare:

openssl s_client -showcerts -verify 5 -connect stackexchange.com:443 < /dev/null

Ciò mostrerà la catena di certificati e tutti i certificati presentati dal server.

Ora, se salvo quei due certificati in file, posso usare openssl verify:

$ openssl verify -show_chain -untrusted dc-sha2.crt se.crt 
se.crt: OK
Chain:
depth=0: C = US, ST = NY, L = New York, O = "Stack Exchange, Inc.", CN = *.stackexchange.com (untrusted)
depth=1: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA (untrusted)
depth=2: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA

L' -untrustedopzione viene utilizzata per fornire i certificati intermedi; se.crtè il certificato da verificare. Il risultato di profondità = 2 proviene dall'archivio della CA attendibile del sistema.

Se non si dispone dei certificati intermedi, non è possibile eseguire la verifica. Ecco come funziona X.509.

A seconda del certificato, può contenere un URI da cui ottenere l'intermedio. Ad esempio, openssl x509 -in se.crt -noout -textcontiene:

        Authority Information Access: 
            OCSP - URI:http://ocsp.digicert.com
            CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt

L'URI di "CA Issuers" punta al certificato intermedio (in formato DER, quindi è necessario utilizzarlo openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pemper convertirlo per un ulteriore utilizzo da parte di OpenSSL).

Se esegui openssl x509 -in /tmp/DigiCertSHA2HighAssuranceServerCA.pem -noout -issuer_hash, ottieni 244b5494, che puoi cercare nell'archivio della CA principale di sistema in /etc/ssl/certs/244b5494.0(basta aggiungere .0al nome).

Non penso che ci sia un comando OpenSSL semplice e piacevole per fare tutto questo per te.


Questo è il problema principale. Non ho l'URL con me. Ho solo il file del certificato. E ho bisogno del contenuto crittografato tra BEGINe il ENDtag (che otterrai dopo aver appena cat
inserito il

@ AnirbanNag'tintinmj 'Se stai solo cercando di decodificare il certificato, provaopenssl x509 -in file.crt -noout -text
derobert

Voglio il contenuto dell'intermedio in root cert che si trova tra il tag BEGINe END.
Anirban Nag 'tintinmj',

O se puoi dare un comando che estrarrà il certificato intermedio e di root dal certificato principale e lo salverà in un file ... Posso convivere anche con quello.
Anirban Nag 'tintinmj',

@ AnirbanNag'tintinmj 'Se non viene visualizzato con il openssl x509comando, non credo che il certificato intermedio sia presente. (A meno che tu non abbia ricevuto qualche errore da openssl x509).
derobert,

12

tl; dr - un liner bash magic per scaricare tutte le certs nella catena

openssl s_client -showcerts -verify 5 -connect de.wikipedia.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

Spiegazione in 2 passaggi

Per scaricare tutte le certs nella catena nella directory corrente come cert${chain_number}.pem:

openssl s_client -showcerts -verify 5 -connect your_host:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' 

bonus-track per rinominarli con il loro nome comune:

for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

C'è qualche motivo per scegliere ".pem" rispetto a ".crt" come estensione dal momento che li stai solo rinominando, non cambiando il formato?
Captain Man,

No, non proprio. ".pem" è il formato (base64 del DER) ".crt" significa che è un certificato ma non dice nulla sulla codifica. Stavo per renderlo più coerente e nominare tutto pem ... Ma penso che sia più semplice da leggere in una riga per capire dove viene scaricato il certificato (crt) e finire ciò che in genere uso nel mondo Linux (pem) . Spero che questo chiarisca un po 'le cose ...
Estani,

1
Sì, mi rendo conto che PEM è un formato, ma spesso vedo crt e non ero sicuro che fosse un formato. Questo in realtà aiuta a spiegare perché vedo "crt" usato così spesso. Grazie :)
Captain Man

Questo sembra funzionare solo se ti fidi già della fonte. Sto cercando di scaricare una CA personalizzata ma sta scaricando solo il primo certificato, non la catena.
mjaggard,

@mjaggard strano da quando l'ho usato esattamente per quel caso. Detto questo, il server potrebbe non inviare affatto la CA principale, se dai un'occhiata al mio esempio, ha usato per scaricare 3 certificati ora sta scaricando solo 2. Presumo che il server Wikipedia non stia inviando la radice (non c'è davvero punto, se non ce l'hai, non ti fiderai comunque ...). Sono abbastanza sicuro che non fosse il caso prima.
estani,
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.