# HTTPS

L'HTTP non è sicuro poiché trasmette le informazioni in chiaro. Per garantire la sicurezza nello scambio di dati, è necessario un livello di cifratura. Come l'HTTP, `HTTPS` si basa sul protocollo TCP e utilizza la porta 443.

La `S` di `secure` deriva dall'uso di protocolli di cifratura, inizialmente l'SSL (*Secure Socket Layer*) e attualmente il `TLS` (*Transport Layer Security*). Questi protocolli garantiscono la cifratura dei dati, proteggendo così la privacy e l'integrità delle informazioni trasmesse.

L'instaurazione di una connessione sicura tramite TLS è conosciuta come `TLS Handshake`.

Durante il TLS Handshake, viene utilizzato un certificato digitale, il quale è emesso da una *Certification Authority* (`CA`). Questo certificato attesta l'identità del sito web, consentendo di stabilire una connessione sicura e assicurando che i dati trasmessi siano cifrati e protetti da accessi non autorizzati.

## Processo di richiesta di un certificato

1. **Inizio della richiesta**: un richiedente desidera abilitare la comunicazione sicura HTTPS per il proprio sito. Per farlo, ha bisogno di un `certificato SSL/TLS` valido, che viene emesso da una CA
2. **Generazione delle chiavi**: il richiedente deve generare una coppia di chiavi, una pubblica e una privata. La chiave pubblica sarà presentata alla CA e inclusa nel certificato SSL/TLS rilasciato, mentre la chiave privata rimarrà segreta e sarà utilizzata per la cifratura
3. **Creazione della CSR**: il richiedente può quindi inviare la propria richiesta alla CA, nota come `Certificate Signing Request` (`CSR`). Questo file contiene informazioni essenziali, tra cui la chiave pubblica, dettagli sul richiedente e la firma digitale del richiedente
4. **Verifica dell'identità**: la CA riceve la CSR e avvia un processo di verifica dell'identità del richiedente. Questo include la verifica del dominio (domain validation), dell'organizzazione e, in alcuni casi, una validazione estesa (extended validation)
5. **Emissione del certificato**: se la CA riesce a confermare l'identità del richiedente, rilascia il certificato SSL/TLS. Questo certificato contiene informazioni come la chiave pubblica del richiedente, la firma digitale della CA (necessaria per la verifica dell'autenticità del certificato), e dettagli sulla validità e sulla scadenza del certificato

## Instaurazione della Connessione Sicura

1. **Avvio della connessione**: un client che desidera connettersi a un server tramite HTTPS inizia con la `Three-way Handshake`. Dopo aver stabilito la connessione (*SYN/SYN-ACK/SYN*), si procede al `TLS Handshake`, che riguarda lo scambio del certificato e l'implementazione della crittografia
2. **Client Hello**: Il client invia un messaggio al server, noto come *Client Hello*. Questo messaggio include informazioni come la versione del protocollo TLS supportata, una lista di Cipher Suites (metodi o algoritmi di cifratura) che il client è in grado di utilizzare, e un numero casuale generato dal client, utilizzato per la generazione successiva delle chiavi
3. **Server Hello**: il server risponde con un *Server Hello*, specificando la versione di TLS preferita, la suite di cifratura scelta, un numero casuale generato dal server e il certificato SSL/TLS
4. **Verifica del certificato**: il client verifica il certificato SSL/TLS ricevuto dal server. Controlla innanzitutto la scadenza, quindi verifica se è stato firmato da una CA riconosciuta. I browser contengono le chiavi pubbliche delle CA comuni e standard, utilizzando queste chiavi per verificare la firma. Se la CA non è standard, deve essere importata nel browser. Infine, il client confronta il nome di dominio del certificato con quello richiesto
5. **Generazione della chiave segreta**: se tutte le verifiche sono positive, il client genera una chiave segreta per la crittografia simmetrica dei dati. Questa chiave segreta viene cifrata utilizzando la chiave pubblica del server, garantendo che solo il server possa decifrarla. Questo metodo sicuro utilizza la crittografia asimmetrica per inviare una chiave destinata alla crittografia simmetrica
6. **Crittografia dei Dati**: Una volta stabilita la chiave segreta, sia il client che il server la utilizzano per criptare le informazioni. L'uso della crittografia asimmetrica per ogni singolo scambio di dati sarebbe troppo oneroso e rallenterebbe significativamente la comunicazione

![tls-handshake](asset/img/tls-handshake.png)
