Server Name Indication (SNI): che cosa si nasconde dietro questo standard?
La sicurezza gioca un ruolo molto importante su Internet. Perciò gli standard, i certificati e i protocolli cercano di proteggere sia l’utente che il server da pericolosi attacchi. Uno di questi protocolli si chiama Transport Layer Security (TLS). Poiché però questo protocollo porta con sé parecchi problemi, è stato ampliato con il Server Name Indication (SNI).
Per cosa è necessario il Server Name Indication?
Prima di poter comprendere perché l’SNI è stato sviluppato, occorre comprendere come funziona il TLS. Il successore di Secure Sockets Layer (SSL) è un cosiddetto handshake TLS. Nel processo, client e server, nella maggior parte dei casi il browser e il sito web, scambiano informazioni prima ancora che inizi il trasferimento vero e proprio dei dati. In questa stretta di mano virtuale il server si identifica di fronte al client e invia anche il relativo certificato di sicurezza. Solo quando il client li ha verificati, inizia la comunicazione e lo scambio di dati. Se la verifica ha esito negativo, non vengono scambiati ulteriori dati.
Ma cosa succede se diversi siti web sono in esecuzione attraverso un indirizzo IP, come per esempio con il virtual hosting? Dato che l’IPv6 non si è ancora affermato come standard, gli indirizzi IP risultano ancora molto limitati e non tutti i domini possono pretendere di avere un indirizzo IP tutto per sé. Ma quindi a chi indirizza il client il proprio “Hello” (il primo passo di un handshake TLS)? Ci sono molte probabilità che risponda il sito sbagliato, che non invii il certificato corretto con il giusto nome dell’host, e che quindi non venga stabilita la connessione. Per cui è importante che il client comunichi al server a quale dominio (host) sta cercando di connettersi. Proprio per questo è stato introdotto il Server Name Indication.
Se si dovesse verificare una discrepanza nella disamina del certificato (il nome del sito web cercato non coincide con il nome del certificato), il client interrompe la trasmissione. Il motivo è che una simile incongruenza può rappresentare un grande rischio per la sicurezza nella forma di un attacco Man in the Middle Attacke.
Come funziona l’SNI?
Quando in una connessione non protetta più siti web utilizzano uno stesso indirizzo IP, non ci sono problemi di sorta. Nell’HTTP è previsto che il nome dell’host sia indicato nell’header nel momento in cui si accede ad un sito. Con il TLS deve però avvenire l’handshake prima che il browser possa inviare questi dati. Il Server Name Indication fa in modo che il nome dell’host sia comunicato prima dello scambio di certificati tra server e client.
L’SNI è un’estensione di TLS. Il protocollo criptato è parte dello stack di protocollo TCP/IP. Come tale, il TLS amplia il Trasmission Control Protocol (TCP) con una cifratura. Con questo passo aggiuntivo HTTP diventa così HTTPS. Ampliando il TLS con il Server Name Indication, il protocollo di sicurezza mette a disposizione con l’handshake un ulteriore campo: sotto il campo ClientHelloExtension si trova quello opzionale ServerName. In questo campo il client (e di questo si fa carico automaticamente il browser) inserisce il nome dell’host con il quale vorrebbe collegarsi. In questo modo è assicurato che risponda l’host corretto.
Server Name Indication nel browser
Gli utenti non si accorgono del funzionamento dell’SNI, dato che nella maggior parte dei casi non devono nemmeno installare o configurare nulla. È sufficiente disporre di un sistema operativo recente e di un browser moderno: infatti Firefox, Chrome, Edge, Opera e Safari supportano questa estensione di default.
Soltanto gli utenti che utilizzano ancora Windows XP (o versioni ancora più datate di Windows) con Internet Explorer non hanno a disposizione il Server Name Indication. Nel caso dell’utilizzo di un sistema operativo che non supporta più gli aggiornamenti, si ha comunque la possibilità di installare un altro browser che supporta l’SNI. Anche la maggior parte dei browser per dispositivi mobili utilizza l’SNI.
Server: IIS, Nginx e Apache con SNI
Diverso è il caso in cui siate voi stessi a gestire il server web, poiché allora in determinate circostanze dovete agire, a seconda di quale server utilizzate: da IIS 8 Microsoft ha integrato nel proprio software un’opzione di default per il Server Name Indication. Con Apache HTTP Server invece è diverso: qui è possibile integrare l’SNI usando OpenSSL (o mod_ssl). In linea generale dovreste far funzionare il modulo soltanto con le estensioni TLS (come è del resto già preimpostato a partire dalla versione 0.9.8k). Potete trovare precise istruzioni per l’installazione dell’SNI con Apache nel wiki di Apache HTTP server.
Anche Nginx dispone di un supporto SNI di default a partire dalla versione 0.5.23 e funziona in linea generale come con Apache. Per controllare se la vostra versione supporta il Server Name Indication, basta inserire il comando nginx –V. Una volta che lo avete verificato, in qualità di webmaster date ad ogni virtual host un nome specifico e associatelo al certificato corretto. Potete trovare maggiori informazioni nella documentazione ufficiale Nginx.
Se il vostro sito non è ancora crittografato, leggete il nostro articolo su come impostare il vostro sito in HTTPS.
Quali sono gli svantaggi di SNI?
Il Server Name Indication non ha soltanto vantaggi: innanzitutto non è supportato da tutti i browser, anche se questo riguarda un numero molto limitato di utenti. Non si tratta però di un modello perfetto, ma di una soluzione di transizione, come si riconosce dal fatto che sono trasmesse informazioni non criptate. Anche se si tratta soltanto del nome dell’host, utilizzando una cifratura accurata è difficile che queste informazioni finiscano in mano a terzi. Insomma sarebbe sicuramente più sicuro se ogni sito web avesse il proprio indirizzo IP specifico, senza quindi dover installare nessun SNI.
Poiché purtroppo questo non si può cambiare a causa della quantità ridotta di indirizzi IP (almeno fino a quando l’IPv6 non verrà introdotto a livello globale), occorre trovare altre soluzioni, una delle quali è appunto offerta dall’SNI. Un’alternativa sarebbe il certificato Subject Alternative Name (SAN): con questi certificati si possono registrare più domini o nomi host, il che significa che al server non importa con quale dominio il client voglia connettersi, poiché il certificato è valido per tutti i domini sul server. Lo svantaggio di questi certificati è che sono relativamente costosi, perciò molti gestori di siti web sono comprensibilmente poco disposti ad implementarli. Se l’alternativa è quella di rinunciare ad avere una pagina crittografata, di sicuro l’SNI rappresenta una buona soluzione intermedia.