Come funziona davvero SSL?


143

Come funziona SSL?

Dove è installato il certificato sul client (o sul browser?) E sul server (o web server?)?

Come si avvia il processo di attendibilità / crittografia / autenticazione quando si immette l'URL nel browser e si ottiene la pagina dal server?

In che modo il protocollo HTTPS riconosce il certificato? Perché HTTP non può funzionare con i certificati quando sono i certificati che fanno funzionare tutti i trust / crittografia / autenticazione?


24
Penso che questa sia una domanda ragionevole: capire come funziona SSL è il passaggio 1, implementarlo correttamente è il passaggio 2 attraverso il passaggio all'infinito.
synthesizerpatel,



5
@StingyJack Non essere un nazista politico qui. Le persone vengono in cerca di aiuto. Non negare loro tutta l'assistenza perché ritieni che la domanda non corrisponda perfettamente alle regole.
Koray Tugay,

1
@KorayTugay - nessuno sta negando l'assistenza. Questo appartiene a Security o Sysadmin, dove è meglio mirato, ma OP trarrebbe beneficio in questo forum aggiungendo un po 'di contesto di programmazione invece di pubblicare una domanda IT generale. Quante persone chiudono le domande quando non sono legate a uno specifico problema di programmazione? Probabilmente troppi, da qui il mio pungente OP per fare quell'associazione.
StingyJack

Risposte:


144

Nota: ho scritto la mia risposta originale molto in fretta, ma da allora, questa è diventata una domanda / risposta abbastanza popolare, quindi l'ho ampliata un po 'e l'ho resa più precisa.

Funzionalità TLS

"SSL" è il nome più spesso usato per fare riferimento a questo protocollo, ma SSL si riferisce specificamente al protocollo proprietario progettato da Netscape a metà degli anni '90. "TLS" è uno standard IETF basato su SSL, quindi userò TLS nella mia risposta. In questi giorni, le probabilità sono che quasi tutte le tue connessioni sicure sul web utilizzano davvero TLS, non SSL.

TLS ha diverse funzionalità:

  1. Crittografa i dati del livello dell'applicazione. (Nel tuo caso, il protocollo del livello applicazione è HTTP.)
  2. Autenticare il server sul client.
  3. Autenticare il client sul server.

# 1 e # 2 sono molto comuni. # 3 è meno comune. Sembra che tu ti stia concentrando sul secondo, quindi ti spiego quella parte.

Autenticazione

Un server si autentica su un client usando un certificato. Un certificato è un blocco di dati [1] che contiene informazioni su un sito Web:

  • Nome del dominio
  • Chiave pubblica
  • La società che lo possiede
  • Quando è stato rilasciato
  • Quando scade
  • Chi l'ha rilasciato
  • Eccetera.

È possibile ottenere la riservatezza (n. 1 sopra) utilizzando la chiave pubblica inclusa nel certificato per crittografare i messaggi che possono essere decrittografati solo dalla chiave privata corrispondente, che deve essere archiviata in modo sicuro su quel server. [2] Chiamiamo questa coppia di chiavi KP1, in modo da non confonderci in seguito. Puoi anche verificare che il nome di dominio sul certificato corrisponda al sito che stai visitando (n. 2 sopra).

E se un avversario potesse modificare i pacchetti inviati da e verso il server, e se quell'avversario avesse modificato il certificato che ti veniva presentato e inserito la propria chiave pubblica o cambiato altri dettagli importanti? In tal caso, l'avversario potrebbe intercettare e modificare qualsiasi messaggio che ritieni fosse crittografato in modo sicuro.

Per evitare questo attacco, il certificato è crittografato in modo crittografico dalla chiave privata di qualcun altro in modo tale che la firma possa essere verificata da chiunque disponga della chiave pubblica corrispondente. Chiamiamo questa coppia di chiavi KP2, per chiarire che queste non sono le stesse chiavi utilizzate dal server.

Autorità di certificazione

Quindi chi ha creato KP2? Chi ha firmato il certificato?

Semplificando un po ', un'autorità di certificazione crea KP2 e vendono il servizio di utilizzo della propria chiave privata per firmare certificati per altre organizzazioni. Ad esempio, creo un certificato e pago un'azienda come Verisign per firmarlo con la propria chiave privata. [3] Poiché nessuno tranne Verisign ha accesso a questa chiave privata, nessuno di noi può falsificare questa firma.

E come potrei ottenere personalmente la chiave pubblica in KP2 per verificare quella firma?

Bene, abbiamo già visto che un certificato può contenere una chiave pubblica - e gli informatici amano la ricorsione - quindi perché non inserire la chiave pubblica KP2 in un certificato e distribuirla in quel modo? All'inizio sembra un po 'folle, ma in effetti è esattamente così che funziona. Continuando con l'esempio di Verisign, Verisign produce un certificato che include informazioni su chi sono, quali tipi di cose sono autorizzati a firmare (altri certificati) e la loro chiave pubblica.

Ora, se ho una copia di quel certificato Verisign, posso usarlo per convalidare la firma sul certificato del server per il sito Web che voglio visitare. Facile vero ?!

Beh, non così in fretta. Ho dovuto ottenere il certificato Verisign da qualche parte . Cosa succede se qualcuno falsifica il certificato Verisign e inserisce la propria chiave pubblica? Quindi possono falsificare la firma sul certificato del server e siamo tornati da dove siamo partiti: un attacco man-in-the-middle.

Catene di certificazione

Continuando a pensare in modo ricorsivo, potremmo ovviamente introdurre un terzo certificato e una terza coppia di chiavi (KP3) e utilizzarlo per firmare il certificato Verisign. Questa viene definita catena di certificati: ogni certificato nella catena viene utilizzato per verificare il certificato successivo. Spero che tu possa già vedere che questo approccio ricorsivo è solo tartarughe / certificati fino in fondo. Dove si ferma?

Dal momento che non siamo in grado di creare un numero infinito di certificati, la catena di certificati ha ovviamente di fermarsi da qualche parte , e che ha fatto includendo un certificato della catena che è auto-firmato .

Mi fermerò un attimo mentre raccogli i pezzi di materia cerebrale dalla tua testa che esplode. Self-Signed ?!

Sì, alla fine della catena di certificati (nota anche come "radice"), ci sarà un certificato che utilizza la propria coppia di chiavi per firmare se stesso. Ciò elimina il problema della ricorsione infinita, ma non risolve il problema di autenticazione. Chiunque può creare un certificato autofirmato che dice qualcosa su di esso, proprio come posso creare un falso diploma di Princeton che dice che mi triplico in politica, fisica teorica, e applico calci e poi firmo il mio nome in fondo.

La soluzione [alquanto poco entusiasmante] a questo problema è solo quella di scegliere una serie di certificati autofirmati di cui ti fidi esplicitamente. Ad esempio, potrei dire "Mi fido di questo certificato autofirmato Verisign".

Con quella fiducia esplicita in atto, ora posso convalidare l'intera catena di certificati. Indipendentemente dal numero di certificati presenti nella catena, posso convalidare ogni firma fino alla radice. Quando arrivo alla radice, posso verificare se quel certificato radice è uno di cui mi fido esplicitamente. Se è così, allora posso fidarmi dell'intera catena.

Fiducia conferita

L'autenticazione in TLS utilizza un sistema di attendibilità conferita . Se voglio assumere un meccanico, potrei non fidarmi di alcun meccanico casuale che trovo. Ma forse il mio amico garantisce un meccanico in particolare. Dal momento che mi fido del mio amico, allora posso fidarmi di quel meccanico.

Quando acquisti un computer o scarichi un browser, viene fornito con alcune centinaia di certificati radice di cui si fida esplicitamente. [4] Le società che possiedono e gestiscono tali certificati possono conferire tale fiducia ad altre organizzazioni firmando i loro certificati.

Questo è ben lungi dall'essere un sistema perfetto. Alcune volte un'autorità di certificazione può emettere un certificato erroneamente. In questi casi, potrebbe essere necessario revocare il certificato. La revoca è complicata poiché il certificato rilasciato sarà sempre crittograficamente corretto; è necessario un protocollo fuori banda per scoprire quali certificati precedentemente validi sono stati revocati. In pratica, alcuni di questi protocolli non sono molto sicuri e molti browser non li controllano comunque.

A volte un'intera CA è compromessa. Ad esempio, se dovessi entrare in Verisign e rubare la loro chiave di firma radice, potresti falsificare qualsiasi certificato al mondo. Nota che ciò non riguarda solo i clienti di Verisign: anche se il mio certificato è firmato da Thawte (un concorrente di Verisign), non importa. Il mio certificato può ancora essere contraffatto utilizzando la chiave di firma compromessa di Verisign.

Questo non è solo teorico. È successo in natura. DigiNotar è stato notoriamente violato e successivamente fallito. Anche Comodo è stato violato , ma inspiegabilmente rimangono in attività fino ad oggi.

Anche quando le CA non sono direttamente compromesse, ci sono altre minacce in questo sistema. Ad esempio, un governo usa la coercizione legale per costringere una CA a firmare un certificato contraffatto. Il datore di lavoro può installare il proprio certificato CA sul computer dei dipendenti. In questi vari casi, il traffico che si prevede sia "sicuro" è in realtà completamente visibile / modificabile per l'organizzazione che controlla tale certificato.

Sono state suggerite alcune sostituzioni, tra cui Convergence , TACK e DANE .

Note finali

[1] I dati del certificato TLS sono formattati secondo lo standard X.509 . X.509 si basa su ASN.1 ( "Abstract Syntax Notation # 1"), il che significa che è non è un formato di dati binari. Pertanto, X.509 deve essere codificato in un formato binario. DER e PEM sono le due codifiche più comuni che io conosca.

[2] In pratica, il protocollo passa effettivamente a una cifra simmetrica, ma questo è un dettaglio che non è rilevante per la tua domanda.

[3] Presumibilmente, la CA convalida effettivamente chi sei prima di firmare il certificato. Se non lo facessero, allora potrei semplicemente creare un certificato per google.com e chiedere a una CA di firmarlo. Con quel certificato, potrei essere nel mezzo di qualsiasi connessione "sicura" a google.com. Pertanto, la fase di convalida è un fattore molto importante nel funzionamento di una CA. Sfortunatamente, non è molto chiaro quanto sia rigoroso questo processo di convalida presso le centinaia di CA in tutto il mondo.

[4] Consulta l' elenco di CA affidabili di Mozilla .


Cos'è una chiave privata?
Koray Tugay,

hai dimenticato di menzionare che la chiave pubblica fa parte del file del certificato inviato al sito Web per decretare i dati crittografati dal server.
mamdouh alramadan,

Grazie @mamdouhalramadan. Ho modificato per menzionarlo.
Mark E. Haase,

2
@mamdouhalramadan "la chiave pubblica è ... inviata al sito Web per decrittografare i dati". Come può essere utilizzata la chiave pubblica per decrittografare i dati?
Teddy

@ateddy Hai ragione. Non può. La chiave pubblica viene utilizzata solo per l'autenticazione. L'affermazione qui che le coppie di chiavi vengono utilizzate anche per la crittografia e la decrittografia non è corretta. A tale scopo viene utilizzata una chiave di sessione negoziata in modo sicuro.
Marchese di Lorne,

53

HTTPS è una combinazione di HTTP e SSL (Secure Socket Layer) per fornire comunicazioni crittografate tra client (browser) e server Web (l'applicazione è ospitata qui).

Perché è necessario?

HTTPS crittografa i dati che vengono trasmessi dal browser al server sulla rete. Pertanto, nessuno può annusare i dati durante la trasmissione.

Come viene stabilita la connessione HTTPS tra browser e web server?

  1. Il browser tenta di connettersi a https://payment.com .
  2. Il server payment.com invia un certificato al browser. Questo certificato include la chiave pubblica del server payment.com e alcune prove del fatto che questa chiave pubblica appartiene effettivamente a payment.com.
  3. Il browser verifica il certificato per confermare che dispone della chiave pubblica appropriata per payment.com.
  4. Il browser sceglie una nuova chiave simmetrica casuale K da utilizzare per la sua connessione al server payment.com. Crittografa K sotto chiave pubblica payment.com.
  5. payment.com decodifica K usando la sua chiave privata. Ora sia il browser che il server di pagamento conoscono K, ma nessun altro lo sa.
  6. Ogni volta che il browser desidera inviare qualcosa a payment.com, lo crittografa sotto K; il server payment.com lo decodifica al momento della ricezione. Ogni volta che il server payment.com vuole inviare qualcosa al tuo browser, lo crittografa sotto K.

Questo flusso può essere rappresentato dal seguente diagramma: inserisci qui la descrizione dell'immagine


1
La parte relativa alla crittografia e all'invio della chiave di sessione e alla decrittografia sul server è completa e completa. La chiave di sessione non viene mai trasmessa affatto: viene stabilita tramite un algoritmo di negoziazione della chiave sicura. Si prega di controllare i fatti prima di pubblicare sciocchezze come questa. RFC 2246.
Marchese di Lorne,

Perché il browser non usa la chiave pubblica del server per crittografare i dati quando li pubblica sul server, invece di creare una nuova chiave simmetrica casuale K al passaggio 4?
KevinBui,

1
@KevinBui Perché l'invio della risposta dal server richiederebbe al client di avere una coppia di chiavi e perché la crittografia asimmetrica è molto lenta.
Marchese di Lorne,

3

Ho scritto un piccolo post sul blog che discute brevemente il processo. Non esitate a dare un'occhiata.

Stretta di mano SSL

Un piccolo frammento dello stesso è il seguente:

"Il client effettua una richiesta al server tramite HTTPS. Il server invia una copia del suo certificato SSL + chiave pubblica. Dopo aver verificato l'identità del server con l'archivio CA locale attendibile, il client genera una chiave di sessione segreta, la crittografa utilizzando il server pubblico chiave e la invia. Il server decodifica la chiave della sessione segreta utilizzando la sua chiave privata e invia un riconoscimento al client. Canale sicuro stabilito. "


"Dopo aver verificato l'identità del server con il suo archivio CA attendibile locale", questo non è strettamente vero. Posso usare un certificato autofirmato e HTTPS funzionerebbe - Posso ottenere una connessione HTTPS sicura a un server . Il certificato attendibile arriva solo quando voglio assicurarmi di parlare con il server giusto .
Teddy,

La parte relativa alla crittografia e all'invio della chiave di sessione e alla decrittografia sul server è completa e completa. La chiave di sessione non viene mai trasmessa affatto: viene stabilita tramite un algoritmo di negoziazione della chiave sicura. Si prega di controllare i fatti prima di pubblicare sciocchezze come questa. RFC 2246.
Marchese di Lorne,

@Teddy Non è corretto. Il controllo della fiducia del certificato è una parte obbligatoria di SSL. Può essere bypassato ma è normalmente in vigore: i certificati autofirmati non funzionano senza misure speciali di un tipo o di un altro.
Marchese di Lorne,

2

Mehaase lo ha già spiegato in dettaglio. Aggiungerò i miei 2 centesimi a questa serie. Ho molti post che ruotano attorno alla stretta di mano e ai certificati SSL. Mentre la maggior parte di questi ruota attorno al server Web IIS, il post è ancora rilevante per l'handshake SSL / TLS in generale. Eccone alcuni per riferimento:

Non trattare CERTIFICATI e SSL come un argomento. Trattali come 2 argomenti diversi e poi prova a vedere chi lavorano insieme. Questo ti aiuterà a rispondere alla domanda.

Stabilire la fiducia tra le parti comunicanti tramite l'archivio certificati

La comunicazione SSL / TLS funziona esclusivamente sulla base della fiducia. Ogni computer (client / server) su Internet ha un elenco di CA radice e CA intermedie che mantiene. Questi sono periodicamente aggiornati. Durante l'handshake SSL questo viene usato come riferimento per stabilire la fiducia. Ad esempio, durante l'handshake SSL, quando il client fornisce un certificato al server. Il server tenterà di verificare se la CA che ha emesso il certificato è presente nel suo elenco di CA. Quando non può farlo, dichiara che non è stato in grado di eseguire la verifica della catena di certificati. (Questa è una parte della risposta. Guarda anche all'AIAper questo.) Il client esegue anche una verifica simile per il certificato del server che riceve in Server Hello. Su Windows, è possibile visualizzare gli archivi certificati per client e server tramite PowerShell. Eseguire quanto segue da una console di PowerShell.

PS Cert:> ls Posizione: CurrentUser StoreNames: {TrustedPublisher, ClientAuthIssuer, Root, UserDS ...}

Posizione: LocalMachine StoreNames: {TrustedPublisher, ClientAuthIssuer, Desktop remoto, Root ...}

Browser come Firefox e Opera non si basano sul sistema operativo sottostante per la gestione dei certificati. Mantengono i propri archivi certificati separati.

L'handshake SSL utilizza sia la crittografia simmetrica che la chiave pubblica. L'autenticazione del server avviene per impostazione predefinita. L'autenticazione client è facoltativa e dipende se l'endpoint del server è configurato per autenticare il client o meno. Fai riferimento al mio post sul blog come ho spiegato in dettaglio.

Finalmente per questa domanda

In che modo il protocollo HTTPS riconosce il certificato? Perché HTTP non può funzionare con i certificati quando sono i certificati che fanno funzionare tutti i trust / crittografia / autenticazione?

I certificati sono semplicemente un file il cui formato è definito dallo standard X.509 . È un documento elettronico che dimostra l'identità di una parte comunicante. HTTPS = HTTP + SSL è un protocollo che definisce le linee guida su come 2 parti dovrebbero comunicare tra loro.

MAGGIORI INFORMAZIONI

  • Per comprendere i certificati dovrai capire quali sono i certificati e leggere anche Gestione certificati. Questo è importante
  • Una volta capito, procedi con l'handshake TLS / SSL. È possibile fare riferimento alle RFC per questo. Ma sono scheletri che definiscono le linee guida. Ci sono diversi blogposts tra cui il mio che spiegano questo in dettaglio.

Se l'attività sopra è stata eseguita, avrai una buona conoscenza dei certificati e SSL.

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.