Transport Layer Security (TLS)
Transport Layer Security (TLS), precedentemente noto come Secure Sockets Layer (SSL), è un protocollo utilizzato dalle applicazioni per comunicare in modo sicuro attraverso una rete, impedendo manomissioni e intercettazioni di e-mail, navigazione web, messaggistica e altri protocolli. Sia TLS che SSL sono protocolli client/server che garantiscono la riservatezza delle comunicazioni utilizzando protocolli crittografici per fornire sicurezza su una rete. Quando un server e un client comunicano tramite TLS, ciò garantisce che nessuna terza parte possa intercettare o manomettere alcun messaggio.
Tutti i browser moderni supportano il protocollo TLS, richiedendo al server di fornire un certificato digitale valido che confermi la sua identità per stabilire una connessione sicura. È possibile che sia il client che il server si autentichino reciprocamente, se entrambe le parti forniscono i propri certificati digitali individuali.
Nota: tutti i principali browser hanno iniziato a rimuovere il supporto per TLS 1.0 e 1.1 all’inizio del 2020; dovrai assicurarti che il tuo server web supporti TLS 1.2 o 1.3 in futuro. Dalla versione 74 in poi, Firefox restituirà un errore Secure Connection Failed quando si connette a server che utilizzano le vecchie versioni di TLS (bug di Firefox 1606734)
Storia del TLS
Quando fu introdotto HTTPS, si basava su Secure Sockets Layer (SSL) 2.0, una tecnologia introdotta da Netscape. Fu aggiornato a SSL 3.0 non molto tempo dopo e, con l’espansione del suo utilizzo, divenne chiaro che era necessario specificare una tecnologia di crittografia comune e standard per garantire l’interoperabilità tra tutti i browser e server Web. L’Internet Engineering Task Force (IETF) specificò TLS 1.0 in RFC 2246 nel gennaio 1999. La versione corrente di TLS è 1.3 (RFC 8446).
Nonostante il fatto che il Web ora utilizzi TLS per la crittografia, molte persone continuano a chiamarlo “SSL” per abitudine.
Sebbene TLS possa essere utilizzato su qualsiasi protocollo di trasporto di basso livello, l’obiettivo originale del protocollo era crittografare il traffico HTTP. HTTP crittografato tramite TLS è comunemente denominato HTTPS. Il traffico Web crittografato tramite TLS viene scambiato per convenzione sulla porta 443 per impostazione predefinita, mentre HTTP non crittografato utilizza la porta 80 per impostazione predefinita. HTTPS rimane un importante caso d’uso per TLS.
HTTP su TLS
TLS fornisce tre servizi principali che aiutano a garantire la sicurezza e la protezione dei dati scambiati con esso:
Autenticazione
L’autenticazione consente a ciascuna parte della comunicazione di verificare che l’altra parte sia chi dichiara di essere.
Crittografia
I dati vengono crittografati durante la trasmissione tra l’agente utente e il server, per evitare che vengano letti e interpretati da parti non autorizzate.
Integrità
TLS garantisce che tra la crittografia, la trasmissione e la decrittografia dei dati, nessuna informazione venga persa, danneggiata, manomessa o falsificata.
Una connessione TLS inizia con una fase di handshake in cui un client e un server concordano su un segreto condiviso e vengono negoziati parametri importanti, come le suite di cifratura. Una volta che i parametri e una modalità di scambio dati in cui vengono scambiati i dati dell’applicazione, come HTTP.
Suite di cifratura
I parametri principali che l’handshake TLS negozia sono una suite di cifratura.
In TLS 1.2 e nelle versioni precedenti, la suite di cifratura negoziata include un set di algoritmi crittografici che insieme forniscono la negoziazione del segreto condiviso, i mezzi con cui un server viene autenticato e il metodo che verrà utilizzato per crittografare i dati.
La suite di cifratura in TLS 1.3 regola principalmente la crittografia dei dati, metodi di negoziazione separati vengono utilizzati per l’accordo sulla chiave e l’autenticazione.
Software diversi potrebbero utilizzare nomi diversi per le stesse suite di cifratura. Ad esempio, i nomi utilizzati in OpenSSL e GnuTLS differiscono da quelli negli standard TLS. La tabella di corrispondenza dei nomi di cifratura nell’articolo del team Mozilla OpSec sulle configurazioni TLS elenca questi nomi e informazioni sui livelli di compatibilità e sicurezza.
Configurazione del server
Configurare correttamente il server è fondamentale. In generale, dovresti provare a limitare il supporto di cifratura alle cifre più recenti possibili che sono compatibili con i browser che desideri siano in grado di connettersi al tuo sito. La guida Mozilla OpSec alle configurazioni TLS fornisce maggiori informazioni sulle configurazioni consigliate.
Per aiutarti a configurare il tuo sito, Mozilla fornisce un utile generatore di configurazioni TLS che genererà file di configurazione per i seguenti server Web:
- Apache
- Nginx
- Lighttpd
- HAProxy
- Amazon Web Services CloudFormation Elastic Load Balancer
L’utilizzo del configuratore è un modo consigliato per creare la configurazione in base alle tue esigenze; quindi copialo e incollalo nel file appropriato sul tuo server e riavvia il server per raccogliere le modifiche. Il file di configurazione potrebbe richiedere alcune modifiche per includere impostazioni personalizzate, quindi assicurati di rivedere la configurazione generata prima di utilizzarla; l’installazione del file di configurazione senza assicurarsi che tutti i riferimenti ai nomi di dominio e simili siano corretti si tradurrà in un server che semplicemente non funziona.
TLS 1.3
RFC 8446: TLS 1.3 è una revisione importante di TLS. TLS 1.3 include numerose modifiche che migliorano la sicurezza e le prestazioni. Gli obiettivi di TLS 1.3 sono:
Rimuovere le funzionalità inutilizzate e non sicure di TLS 1.2.
Includere una solida analisi di sicurezza nella progettazione.
Migliorare la privacy crittografando una parte maggiore del protocollo.
Ridurre il tempo necessario per completare un handshake.
TLS 1.3 cambia gran parte dei fondamenti del protocollo, ma conserva quasi tutte le funzionalità di base delle precedenti versioni di TLS. Per il Web, TLS 1.3 può essere abilitato senza compromettere la compatibilità, con alcune rare eccezioni (vedere di seguito).
Le principali modifiche in TLS 1.3 sono:
- L’handshake TLS 1.3 si completa in un round trip nella maggior parte dei casi, riducendo la latenza dell’handshake.
- Un server può abilitare un handshake 0-RTT (zero round trip time). I client che si riconnettono al server possono inviare richieste immediatamente, eliminando completamente la latenza dell’handshake TLS. Sebbene i guadagni in termini di prestazioni da 0-RTT possano essere significativi, comportano un certo rischio di attacco di replay, quindi è necessaria una certa attenzione prima di abilitare questa funzionalità.
- TLS 1.3 supporta solo le modalità forward-secure, a meno che la connessione non venga ripresa o non utilizzi una chiave pre-condivisa.
- TLS 1.3 definisce un nuovo set di suite di cifratura esclusive di TLS 1.3. Tutte queste suite di cifratura utilizzano algoritmi moderni di crittografia autenticata con dati associati (AEAD).
- L’handshake TLS 1.3 è crittografato, ad eccezione dei messaggi necessari per stabilire un segreto condiviso. In particolare, ciò significa che i certificati server e client sono crittografati. Si noti tuttavia che l’identità del server (il nome server o l’estensione SNI) che un client invia al server non è crittografata.
- Numerosi meccanismi sono stati disabilitati: rinegoziazione, compressione dati generica, certificati Digital Signature Algorithm (DSA), scambio di chiavi RSA statiche e scambio di chiavi con gruppi Diffie-Hellman (DH) personalizzati.
Sono disponibili implementazioni di versioni bozza di TLS 1.3. TLS 1.3 è abilitato in alcuni browser, inclusa la modalità 0-RTT. I server Web che abilitano TLS 1.3 potrebbero dover modificare la configurazione per consentire a TLS 1.3 di funzionare correttamente.
TLS 1.3 aggiunge solo un nuovo caso d’uso significativo.
L’handshake 0-RTT può fornire significativi guadagni di prestazioni per applicazioni sensibili alla latenza, come il Web. L’abilitazione di 0-RTT richiede passaggi aggiuntivi, sia per garantire una distribuzione di successo che per gestire i rischi di attacchi di replay.
La rimozione della rinegoziazione in TLS 1.3 potrebbe influenzare alcuni server Web che si basano sull’autenticazione client tramite certificati. Alcuni server Web utilizzano la rinegoziazione per garantire che i certificati client siano crittografati o per richiedere certificati client solo quando vengono richieste determinate risorse. Per la privacy dei certificati client, la crittografia dell’handshake TLS 1.3 garantisce che i certificati client siano crittografati; tuttavia, ciò potrebbe richiedere alcune modifiche software. L’autenticazione client reattiva tramite certificati è supportata da TLS 1.3 ma non ampiamente implementata. Sono in fase di sviluppo meccanismi alternativi, che supporteranno anche HTTP/2.
Ritiro delle vecchie versioni TLS
Per contribuire a creare un web più moderno e sicuro, tutti i principali browser hanno iniziato a rimuovere il supporto per TLS 1.0 e 1.1 all’inizio del 2020. Dovrai assicurarti che il tuo server web supporti TLS 1.2 o 1.3 in futuro.
Dalla versione 74 in poi, Firefox restituirà un errore di connessione protetta non riuscita quando si connette a server che utilizzano le vecchie versioni TLS (bug di Firefox 1606734).
Valori di timeout dell’handshake TLS
Se l’handshake TLS inizia a rallentare o non rispondere per qualche motivo, l’esperienza dell’utente può essere influenzata in modo significativo. Per mitigare questo problema, i browser moderni hanno implementato i timeout dell’handshake:
Dalla versione 58, Firefox implementa un timeout dell’handshake TLS con un valore predefinito di 30 secondi. Il valore del timeout può essere modificato modificando la preferenza network.http.tls-handshake-timeout in about:config.