A previous version of this tutorial was written by Sergey Zhukaev.
Introduzione
Nginx è un server web open source veloce e affidabile. Ha guadagnato popolarità grazie al suo basso consumo di memoria, alta scalabilità, facilità di configurazione e supporto per una vasta gamma di protocolli.
HTTP/2 è una versione più recente del Protocollo di Trasporto Ipotestuale, utilizzato sul Web per consegnare le pagine dal server al browser. HTTP/2 è il primo grande aggiornamento di HTTP in quasi due decenni: HTTP1.1 è stato introdotto al pubblico nel 1999 quando le pagine web erano molto più piccole. Internet è drasticamente cambiata da allora, e ora ci troviamo di fronte alle limitazioni di HTTP 1.1. Il protocollo limita le velocità di trasferimento potenziali per la maggior parte dei siti web moderni perché scarica parti di una pagina in coda – la parte precedente deve essere scaricata completamente prima che inizi il download della parte successiva – e una media di una pagina web moderna scarica dozzine di singoli asset CSS, javascript e immagini.
HTTP/2 risolve questo problema perché porta alcuni cambiamenti fondamentali:
- Tutte le richieste vengono scaricate in parallelo, non in coda
- Gli header HTTP sono compressi
- Le pagine vengono trasferite come binario, non come file di testo, il che è più efficiente
- I server possono “spingere” i dati anche senza la richiesta dell’utente, migliorando la velocità per gli utenti con alta latenza
Anche se HTTP/2 non richiede la crittografia, gli sviluppatori dei due browser più popolari, Google Chrome e Mozilla Firefox, hanno dichiarato che per motivi di sicurezza supporteranno HTTP/2 solo per le connessioni HTTPS. Pertanto, se decidi di configurare server con supporto HTTP/2, devi anche proteggerli con HTTPS.
Questo tutorial ti aiuterà a configurare un server Nginx veloce e sicuro con supporto per HTTP/2.
Prerequisiti
Prima di iniziare, avrai bisogno di alcune cose:
- Un server Ubuntu 22.04 configurato seguendo la guida per la configurazione iniziale del server Ubuntu 22.04, compreso un utente sudo non root e un firewall.
- Nginx installato sul tuo server, che puoi fare seguendo Come installare Nginx su Ubuntu 22.04.
- A domain name configured to point to your server. You can purchase one on Namecheap or get one for free on Freenom. You can learn how to point domains to DigitalOcean Droplets by following the documentation on How To Manage Your Domain With DigitalOcean.
- A TLS/SSL certificate configured for your server. You have two options:
- Puoi ottenere un certificato gratuito da Let’s Encrypt seguendo Come proteggere Nginx con Let’s Encrypt su Ubuntu 22.04.
- È anche possibile generare e configurare un certificato auto-firmato seguendo Come Creare un Certificato SSL Auto-firmato per Nginx in Ubuntu 22.04.
- Nginx configurato per reindirizzare il traffico dalla porta
80
alla porta443
, il che dovrebbe essere coperto dai prerequisiti precedenti. - Nginx configurato per utilizzare una chiave Ephemeral Diffie-Hellman (DHE) da 2048 bit o superiore, il che dovrebbe essere coperto anche dai prerequisiti precedenti.
Passaggio 1 — Abilitare il Supporto per HTTP/2
Se hai seguito il passaggio di configurazione del blocco del server nel tutorial di installazione di Nginx, dovresti avere un blocco del server per il tuo dominio in /etc/nginx/sites-available/il_tuo_dominio
con la direttiva server_name
già impostata correttamente. La prima modifica che faremo sarà modificare il blocco del server del tuo dominio per utilizzare HTTP/2.
Apri il file di configurazione per il tuo dominio utilizzando nano
o il tuo editor preferito:
Nel file, individua le variabili listen
associate alla porta 443
:
...
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
...
Il primo è per le connessioni IPv6. Il secondo è per tutte le connessioni IPv4. Abiliteremo HTTP/2 per entrambi.
Modifica ogni direttiva listen
per includere http2
:
...
listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
...
Questo dice a Nginx di utilizzare HTTP/2 con i browser supportati.
Salva il file di configurazione ed esci dall’editor di testo. Se stai usando nano
, premi Ctrl+X
quindi, quando richiesto, Y
e poi Invio.
Ogni volta che apporti modifiche ai file di configurazione di Nginx, dovresti controllare la configurazione per errori, utilizzando il flag -t
, che esegue il comando di controllo della sintassi incorporato di Nginx:
Se la sintassi è priva di errori, riceverai un output simile al seguente:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Successivamente, configurerai il tuo server Nginx per utilizzare un elenco di cifrari più restrittivo per migliorare la sicurezza del server.
Passaggio 2 — Rimozione delle Suite di Cifre Vecchie e Non Sicure
HTTP/2 ha un elenco bloccato di cifre vecchie e non sicure che dovrebbero essere evitate. Le suite di cifratura sono algoritmi crittografici che descrivono come i dati trasferiti devono essere criptati.
Il metodo che utilizzerai per definire i cifrari dipende da come hai configurato i certificati TLS/SSL per Nginx.
Se hai utilizzato Certbot per ottenere i tuoi certificati, ha anche creato il file /etc/letsencrypt/options-ssl-nginx.conf
che contiene cifrature non abbastanza sicure per HTTP/2. Tuttavia, modificare questo file impedirà a Certbot di applicare aggiornamenti in futuro, quindi diremo semplicemente a Nginx di non utilizzare questo file e specificheremo la nostra lista di cifrature.
Apri il file di configurazione del blocco del server per il tuo dominio:
sudo nano /etc/nginx/sites-enabled/your_domain
Trova la riga che include il file options-ssl-nginx.conf
e commentala aggiungendo un carattere #
all’inizio della riga:
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
Sotto quella riga, aggiungi questa linea per definire le cifrature consentite:
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
Salva il file ed esci dall’editor.
Se hai utilizzato certificati auto-generati o un certificato da un terzo e lo hai configurato secondo i prerequisiti, apri il file /etc/nginx/snippets/ssl-params.conf
nel tuo editor di testo:
Trova la seguente riga:
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...
Modificala per utilizzare la seguente lista di cifrature:
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
Salva il file ed esci dall’editor.
Controlla nuovamente la configurazione per gli errori di sintassi utilizzando il comando nginx -t
:
Se incontri errori, affrontali e prova di nuovo.
Una volta che la tua configurazione super supera il controllo di sintassi, riavvia Nginx utilizzando il comando systemctl
:
Con il server riavviato, verifichiamo che funzioni.
Passaggio 3 — Verifica che HTTP/2 sia abilitato
Assicuriamoci che il server sia in esecuzione e funzioni con HTTP/2.
Utilizza il comando curl
per fare una richiesta al tuo sito e visualizzare gli header:
Riceverai un output simile al seguente:
HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes
Puoi anche verificare che HTTP/2 sia in uso su Google Chrome. Apri Chrome e vai a https://tuo_dominio
. Apri gli Strumenti per gli sviluppatori di Chrome (Visualizza -> Sviluppatore -> Strumenti per gli sviluppatori) e ricarica la pagina (Visualizza -> Ricarica questa pagina). Vai alla scheda Rete, fai clic con il pulsante destro del mouse sulla riga dell’intestazione della tabella che inizia con Nome e seleziona l’opzione Protocollo dal menu a comparsa.
Ora avrai una nuova colonna Protocollo che contiene h2
(che sta per HTTP/2), indicando che HTTP/2 è in funzione.
A questo punto, sei pronto a servire contenuti tramite il protocollo HTTP/2. Miglioriamo la sicurezza e le prestazioni abilitando HSTS.
Passaggio 4 — Abilitazione di HTTP Strict Transport Security (HSTS)
Anche se le tue richieste HTTP vengono reindirizzate a HTTPS, puoi abilitare HTTP Strict Transport Security (HSTS) per evitare di dover fare quei reindirizzamenti. Se il browser trova un’intestazione HSTS, non cercherà di connettersi nuovamente al server tramite HTTP regolare per un determinato periodo di tempo. In ogni caso, scambierà dati utilizzando solo una connessione HTTPS criptata. Questa intestazione ci protegge anche da attacchi di declassamento del protocollo.
Apri nuovamente il file di configurazione del blocco del server per il tuo dominio:
sudo nano /etc/nginx/your_domain
Aggiungi questa riga allo stesso blocco del file contenente i cifrari SSL per abilitare HSTS:
server {
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
add_header Strict-Transport-Security "max-age=15768000" always;
}
...
Il max-age
è impostato in secondi. Il valore 15768000
è equivalente a 6 mesi.
Per impostazione predefinita, questa intestazione non viene aggiunta alle richieste dei sottodomini. Se hai sottodomini e desideri che HSTS si applichi a tutti loro, dovresti aggiungere la variabile includeSubDomains
alla fine della riga, così:
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
Salva il file ed esci dall’editor.
Controlla nuovamente la configurazione per eventuali errori di sintassi:
Infine, riavvia il server Nginx per applicare le modifiche.
Conclusione
Il tuo server Nginx sta ora servendo pagine HTTP/2. Se desideri testare la sicurezza della tua connessione SSL, visita Qualys SSL Lab ed esegui un test sul tuo server. Se tutto è configurato correttamente, dovresti ottenere un punteggio A+ per la sicurezza.
Per saperne di più su come Nginx analizza e implementa le regole dei blocchi del server, prova a leggere Comprensione degli algoritmi di selezione dei blocchi del server e delle posizioni di Nginx.