Come funziona la selezione tra più catene di certificati disponibili?

3

Sto cercando di capire i meccanismi pratici dei certificati (intermedi) cross-signing. Ad esempio, sto esaminando Let's Encrypt Chain of Trust . Quella pagina menziona:

IdenTrust has cross-signed our intermediates. This allows our end certificates to be accepted by all major browsers while we propagate our own root.

Inoltre, la pagina contiene collegamenti a entrambi il certificato intermedio firmato con la chiave privata appartenente alla propria CA radice ISRG così come il certificato intermedio firmato con la chiave privata appartiene alla CA di IdenTrust .

La mia aspettativa era vedere entrambi i certificati intermedi in arrivo sul cavo quando si imposta una connessione TLS con www.letsencrypt.org, lasciando al cliente la decisione su quale dei due intermediari utilizzare per costruire una catena di fiducia. Tuttavia, vedo solo l'intermedio firmato da IdenTrust.

L'ho osservato con wireshark, analizzando il traffico TLS mentre navigavo su www.letsencrypt.org con il mio browser web. Per forzare "l'altra" catena di fiducia, non mi sono fidato del certificato Root CA X3 dell'ora legale nell'app Keychain Access (sono su un Mac) e infatti non ero più in grado di navigare nel sito. Poi ho aggiunto il certificato ISRG Root X1, che indica di fidarsi sempre di esso ma non riesco ancora a navigare nel sito. Questo supporta la mia osservazione che il certificato intermedio firmato da ISRG non viene mai fornito dal server.

Ho anche provato l'app openssl s_client , ma senza risultati.

Supponiamo che mi fidi della radice ISRG e non di IdenTrust, come faccio a far condividere al server il certificato intermedio firmato da ISRG Root? O più generalmente richiesto, se sono disponibili più catene di trust, ad esempio a causa della firma incrociata, come vengono condivisi i certificati di entrambe le catene con i client? Perché non ricevo un pacchetto che contiene entrambi i certificati per l'intermedio?

Aggiornamento: la prima risposta afferma che le specifiche TLS non consentono lo scambio di più catene di certificati. Questo spiega molto.

Tuttavia, le mie aspettative sono impostate dalle risposte alla domanda Qual è l'utilizzo dei certificati di cross signing in X.509? . La risposta accettata menziona: "Si tratta di espandere la fiducia" e "aumentare la facilità di verifica della fiducia, come le situazioni in cui hai clienti che si fidano di CA1 o CA2 (ma non di entrambi). In tal caso, puoi attraversare -Accedi ad un cert di cui fidarsi entrambi. ".

Se è consentita la sostituzione di una sola catena, ciò non sembra come "fiducia in espansione", ma piuttosto come "modifica della fiducia". Inoltre, per un server particolare, se deve selezionare una particolare catena, allora l'argomento "facilità di verifica" non contiene più nessuno - almeno non se il tuo unico meccanismo disponibile è l'handshake TLS. È corretto?

    
posta Reinier Torenbeek 10.08.2018 - 17:43
fonte

1 risposta

2

Questa domanda è in qualche modo correlata e puoi vedere da La risposta di StackzOfZtuff che può essere inviata solo una catena. Quando ci si connette con openssl s_client -connect letsencrypt.org:443 si restituisce alla catena la radice di IdenTrust (Digital Signature Trust Co. che IdenTrust ha acquistato molto tempo fa):

Certificate chain
 0 s:/CN=www.letsencrypt.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3

Poiché la catena di certificati inviata ha la firma di IdenTrust, non può essere verificata con la radice ISRG.

Come notato qui il cliente non ha l'obbligo di usare la catena che il server invia, può tentare di costruirne propria catena a una radice attendibile. Tuttavia, ciò richiede che il client abbia già tutti gli intermedi necessari che non sono stati inviati dal server.

Se aggiungo il intermediate firmato da ISRG Root X1 al mio trust store, s_client scoprirà quella catena nonostante sia stata inviata la catena IdenTrust (a meno che non sia detto di non usare -no_alt_chains ):

$ openssl s_client -connect letsencrypt.org:443
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = www.letsencrypt.org
verify return:1
---
Certificate chain
 0 s:/CN=www.letsencrypt.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
    
risposta data 10.08.2018 - 18:17
fonte

Leggi altre domande sui tag