Usa openssl per verificare singolarmente i componenti di una catena di certificati

8

Questo è legato a un'altra domanda, Come verificare una firma di un'entità da un'altra utilizzando la CLI di OpenSSL?

Ho usato openssl s_client -showcerts -connect www.google.com:443 per raccogliere tre certificati da google. Chiamali g0 , g1 , g2 , dove:

  • g0 è un certificato foglia firmato dalla CA intermedia di Google
  • g1 contiene la chiave pubblica della CA intermedia ed è firmata da GeoTrust CA
  • g2 contiene la chiave pubblica GeoTrust ed è firmata da EquiFax CA

Il mio obiettivo è dimostrare che questa è una catena di firme valida, passo dopo passo, utilizzando la CLI di OpenSSL. La prova intuitiva è questa:

$ openssl verify -CAfile g1 g0

Tuttavia, OpenSSL utilizza certs dal suo store di fiducia (vedi Come verificare una firma di un'entità con un'altra utilizzando OpenSSL CLI? ). Così, invece, uccido l'archivio fidato come @ dave_thompson_085 suggerito in un commento alla domanda sopra citata. Ma questo non sembra funzionare:

$ openssl verify -CApath /dev/null -CAfile g1 g0
g1.crt: C = US, O = Google Inc, CN = Google Internet Authority G2
error 2 at 1 depth lookup:unable to get issuer certificate

Quindi, come faccio a pubblicare correttamente questo comando verify in modo tale da poter verificare in particolare se g1 ha firmato g0 ?

$ openssl version
OpenSSL 1.0.1f 6 Jan 2014
    
posta Fixee 21.03.2016 - 00:01
fonte

2 risposte

6

Ho risolto il mio problema più o meno come segue:

Esiste un'opzione su verify chiamata -partial_chain che consente di verificare l'output OK senza trovare una catena che atterra al certificato di fiducia attendibile autofirmato. Tuttavia, -partial_chain non esiste sulla versione di OpenSSL che ho, né in alcuna versione successiva di 1.0.1. Ecco il run-down:

  • OpenSSL 1.0.1f - Questo è l'ultimo di Ubuntu 14.04; ha la correzione heartbleed
  • OpenSSL 1.0.1s - Questo è l'ultimo nella riga 1.0.1 e probabilmente è l'ultimo; deve essere installato a mano in Ubuntu 14.04
  • OpenSSL 1.0.2g - Attualmente l'ultimo nella linea 1.0.2; questo supporta -partial_chain
  • OpenSSL 1.1 - Al momento è in alpha e ha ancora più opzioni, ma non l'ho esplorato

Quindi, con 1.0.2g o successivo, si può fare quanto segue:

$ openssl verify -CApath /dev/null -partial_chain -trusted g1 g0
g0: OK
$ openssl verify -CApath /dev/null -partial_chain -trusted g2 g1
g1: OK
$ openssl verify -CApath /dev/null -trusted /etc/ssl/certs/EquiFax_Secure_CA.pem g2
g2: OK

(Notare che -partial_chain non era necessario nell'ultimo comando dato che il certificato di base di Equifax è autofirmato.)

Questo soddisfa la mia domanda, ma richiede una versione di OpenSSL che non è ancora disponibile su alcune distribuzioni a meno che non si installi manualmente. Se sei bloccato con una versione precedente alla 1.0.2, probabilmente devi usare il metodo di @Anthony Geoghegan.

Nota: Esiste un'opzione elencata nei documenti verify denominati -no-CApath , che presumibilmente ovvia alla necessità di -CApath /dev/null , ma non è disponibile su 1.0.2g o precedente, basato su i miei test Presumo sia disponibile in 1.1.

    
risposta data 21.03.2016 - 16:38
fonte
4

Il comando openSSL verify crea una catena di certificati completa (fino a quando raggiunge un certificato CA autofirmato) per verificare un certificato. Dalla sua pagina man:

Firstly a certificate chain is built up starting from the supplied certificate and ending in the root CA. It is an error if the whole chain cannot be built up.

Restituisce un risultato positivo solo se può verificare la catena completa .

If any operation fails then the certificate is not valid.

Tuttavia, i seguenti risultati del comando forniscono informazioni sufficienti a dimostrare che il certificato g0 è firmato dal certificato g1 .

$ openssl verify -CApath /dev/null -CAfile g1 g0
g1.crt: C = US, O = Google Inc, CN = Google Internet Authority G2
error 2 at 1 depth lookup:unable to get issuer certificate

Errore 2 indica che uno dei certificati nella catena non può essere trovato.

2 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: unable to get issuer certificate

the issuer certificate of a looked up certificate could not be found. This normally means the list of trusted certificates is not complete.

La cosa importante qui è che depth è 1. Questo indica che il certificato da verificare è stato verificato al primo livello, depth 0 (di g1 certificato).

Se il certificato g1 era not usato per firmare il certificato g0 , l'errore sarebbe al primo stadio, profondità 0 e dovresti invece ricevere Errore 20 :

error 20 at 0 depth lookup:unable to get local issuer certificate

20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: unable to get local issuer certificate

the issuer certificate could not be found: this occurs if the issuer certificate of an untrusted certificate cannot be found.

    
risposta data 21.03.2016 - 02:16
fonte

Leggi altre domande sui tag