Quale parte di TLS specifica come verificare una catena di certificati

11

A volte mi imbatto in una situazione in cui vedo un certificato CA radice che è impostato per scadere prima del certificato CA intermedio.

La mia domanda è: se fossi interessato a mantenere attiva la tua CA intermedia e dovessi aggiornarla per fare riferimento a un certificato radice appena creato, quale sarebbe la necessità di cambiare la CA intermedia? Credo che questo sia il campo Emittente, ma è in grado di essere aggiornato dinamicamente come alcune SAN o è necessario aggiornare anche il certificato intermedio CA?

Immagino che questo possa anche essere riassunto come: dove in un certificato indica chi sei stato firmato e come si presenta?

Punti bonus per rispondere a dove nel processo di handshake viene presentata la catena di certificati al client e ciò che lo rende necessario (presumo che sia completamente diretto dal client poiché alcuni client non richiedono che il server presenti la catena di certificati a verificare la legittimità di un server cert)?

    
posta JZeolla 18.02.2015 - 22:30
fonte

3 risposte

13

All'interno di SSL / TLS, il server invia la catena di certificati al client in modo sistematico (beh, a meno che il cliente non voglia negoziare una suite di crittografia che non utilizza alcun certificato, ma in pratica è piuttosto raro). Vedi lo standard TLS , in particolare questo diagramma, che dice tutto:

  Client                                               Server

  ClientHello                  -------->
                                                  ServerHello
                                                 Certificate*
                                           ServerKeyExchange*
                                          CertificateRequest*
                               <--------      ServerHelloDone
  Certificate*
  ClientKeyExchange
  CertificateVerify*
  [ChangeCipherSpec]
  Finished                     -------->
                                           [ChangeCipherSpec]
                               <--------             Finished
  Application Data             <------->     Application Data

         Figure 1.  Message flow for a full handshake

Per (molto) spiegazioni più complete su come funziona SSL / TLS, leggi questa risposta .

Si noti, tuttavia, che mentre SSL / TLS si basa formalmente sui certificati X.509, il protocollo non è irriducibilmente sposato con X.509. All'interno della dinamica della stretta di mano, l'idea è che il server invii la sua chiave pubblica al client all'interno di una catena di certificati , e quindi il client in qualche modo utilizza la chiave pubblica del server. Il modo in cui il client ottiene la chiave pubblica del server è un po 'fuori portata; normalmente, il client lo fa decodificando e convalidando la catena di certificati inviata dal server, ma il client è libero di "conoscere" la chiave pubblica del server da qualsiasi altro modo che ritenga opportuno. In alcune applicazioni dedicate (in particolare i sistemi embedded), il client può contenere una copia codificata della chiave pubblica del server, e solo usarlo, ignorando completamente ciò che il server invia come "catena di certificati".

Inoltre, la "catena di certificati", dal punto di vista di SSL / TLS, è una sequenza di BLOB opachi, in modo tale che la lunghezza totale non superi i 16 megabyte. Sebbene questi BLOB siano normalmente certificati X.509 codificati, possono essere qualcos'altro, purché il client sia d'accordo (e un client che ignora la catena di certificati del server, per definizione, accetterà qualsiasi cosa). Esiste anche una RFC formalmente definita per l'utilizzo delle chiavi OpenPGP invece dei certificati X.509 in SSL / TLS.

SE la catena di certificati segue le solite regole (certificati X.509, che il client convalida), quindi Si applicano le regole X.509 . L'algoritmo di convalida del percorso X.509 completo è un lavoro del Diavolo per confondere e corrompere le menti dei buoni uomini . Tuttavia, come semplice riepilogo, un certificato emesso (il tuo "certificato CA intermedio") corrisponde al suo emittente (nel tuo caso, la radice) attraverso le due seguenti proprietà, che devono essere tutte soddisfatte:

  • Il campo subjectDN nell'emittente (root) deve essere uguale al campo issuerDN nella CA emessa (CA intermedio). Grazie alla moltitudine di possibili codifiche e regole Unicode bizantine per la corrispondenza dei casi, l'effettiva "uguaglianza" dei nomi è una nozione potenzialmente complessa.

  • Un certificato è firmato ; la firma sul certificato rilasciato deve essere verificabile per quanto riguarda la chiave pubblica dell'emittente.

Pertanto, se si desidera mantenere invariato il certificato CA intermedio, allora, per lo meno, la nuova root dovrà utilizzare lo stesso identico nome precedente, e anche l'esatto stessa coppia di chiavi. Se si modifica uno (o entrambi), sarà necessario riemettere un nuovo certificato per la CA intermedia.

Gli stessi principi si applicano lungo la catena: se si modifica il certificato CA intermedio, è possibile mantenere invariati i certificati dell'entità finale (i certificati precedentemente emessi dalla CA intermedia), se (e solo se) la nuova CA intermedia il certificato contiene ancora lo stesso nome CA intermedio e la chiave pubblica CA intermedia.

    
risposta data 18.02.2015 - 23:10
fonte
3

In realtà c'è molto poco nella specifica TLS sulla verifica dei certificati. La specifica TLS è sufficientemente flessibile da consentire tipi di autenticazione diversi dai certificati X.509, come i certificati OpenPGP o Kerberos .

Ci sono alcune aspettative e riferimenti a concetti relativi a X.509, come la lista certificate_authorities per l'autenticazione client-cert, la definizione di certificate_list nel Certificato server messaggio, e il significato di alcuni messaggi di avviso .

Detto questo, la catena di certificati è piuttosto opaca per quanto riguarda la specifica TLS. Uno dei punti principali è Appendice D :

D.2. Certificates and Authentication

   Implementations are responsible for verifying the integrity of
   certificates and should generally support certificate revocation
   messages.  Certificates should always be verified to ensure proper
   signing by a trusted Certificate Authority (CA).  The selection and
   addition of trusted CAs should be done very carefully.  Users should
   be able to view information about the certificate and root CA.

Il processo di verifica tende a basarsi su altre specifiche: RFC 5280 (o ancora RFC 3280) per l'aspetto PKI, vale a dire la verifica della catena e RFC 6125 per la verifica del nome (o ancora RFC 2818 e altri protocolli specifici specifiche).

Come regola generale, il Nome distinto emittente di un certificato deve essere Soggetto Distinguished Nome del certificato della CA che lo ha emesso. Per quanto riguarda i nomi alternativi, la specifica dice :

4.2.1.7. Issuer Alternative Name

   As with Section 4.2.1.6, this extension is used to associate Internet
   style identities with the certificate issuer.  Issuer alternative
   name MUST be encoded as in 4.2.1.6.  Issuer alternative names are not
   processed as part of the certification path validation algorithm in
   Section 6.  (That is, issuer alternative names are not used in name
   chaining and name constraints are not enforced.)

(Dovresti anche riutilizzare lo stesso materiale chiave se vuoi comunque che la chiave pubblica nel certificato CA verifichi la firma del certificato.)

    
risposta data 18.02.2015 - 23:51
fonte
1

Le risposte di riepilogo che volevi:

  • Il campo Emittente è un DN che identifica chi ha firmato il certificato.
  • Un DN (Distinguished Name) è uno di quei stravaganti "C = US, O = HAL, OU = Discovery One, CN = Dave Bowman" stringhe
  • Ma avere il nome giusto conta solo se sei nelle radici fidate locali!

Ma alla tua domanda principale: non è necessario modificare il certificato intermedio per fare riferimento a un certificato di root appena aggiornato. È possibile emettere un nuovo certificato per la radice senza invalidare quello precedente o interrompere il collegamento al certificato intermedio. L '"Emittente" è una stringa, non un numero seriale, quindi una riemissione dello stesso nome del certificato radice che è posizionata correttamente nell'archivio di fiducia può estendere la scadenza rispetto all'originale.

Mi sono imbattuto in un caso di questo ultimo mese; Ho un certificato che è firmato dal cert intermedio Entrust L1C, che è a sua volta firmato da CN = Entrust.net Certification Authority (2048). La copia di tale certificato di root era la seguente fino a poco tempo fa:

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 946059622 (0x3863b966)
Signature Algorithm: sha1WithRSAEncryption
    Issuer: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
    Validity
        Not Before: Dec 24 17:50:51 1999 GMT
        Not After : Dec 24 18:20:51 2019 GMT
    Subject: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)

Durante l'aggiornamento del SO alla fine di gennaio, il certificato di root è stato tranquillamente sostituito con una versione più recente. Si noti che il numero di serie e le date di validità cambiano, ma che la stringa Emittente non:

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 946069240 (0x3863def8)
Signature Algorithm: sha1WithRSAEncryption
    Issuer: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
    Validity
        Not Before: Dec 24 17:50:51 1999 GMT
        Not After : Jul 24 14:15:12 2029 GMT
    Subject: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)

Dati questi due diversi file di root, openssl ha verificato correttamente la catena di certificati usando uno dei due:

$ md5sum entrust.*.pem
da9ff9cd8e8e2256e9efcf5c4ef3891f  entrust.L1C.pem
244f3bbf6b112e7d399342c097db22a5  entrust.new.root.pem
0315b2915a0f74cc3498cfdd54933452  entrust.old.root.pem
$ openssl verify -CAfile entrust.old.root.pem entrust.L1C.pem
entrust.L1C.pem: OK
$ openssl verify -CAfile entrust.new.root.pem entrust.L1C.pem
entrust.L1C.pem: OK
$

Per i punti bonus:

L'handshake TLS inizia generalmente in questo modo:

C -> S Client Hello

S -> C Server Hello

S -> C Server Certificate

E i certificati vengono inviati in uno stream, dal più specifico - > intermedio - > radice. Puoi effettivamente catturare i byte da uno sniffer come Wireshark e salvarli in un file e trattarli come un .der (certificato codificato in binario). L'ho fatto con i certs qui sopra e ho usato openssl per tradurli da .der a .pem per mia comodità.

    
risposta data 18.02.2015 - 23:21
fonte

Leggi altre domande sui tag