Let's Encrypt è un'autorità di certificazione gratuita, automatizzata e aperta sviluppata dall'Internet Security Research Group (ISRG) che fornisce certificati SSL gratuiti.
I certificati emessi da Let's Encrypt sono considerati affidabili da tutti i principali browser e hanno una validità di 90 giorni dalla data di emissione.
Questo tutorial mostra come installare un certificato SSL Let's Encrypt gratuito su Debian 10, Buster che esegue Nginx come server web. Mostreremo anche come configurare Nginx per utilizzare il certificato SSL e abilitare HTTP/2.
Prerequisiti #
Assicurati che i seguenti prerequisiti siano soddisfatti prima di procedere con la guida:
- Accesso come root o utente con privilegi sudo.
- Il dominio per il quale desideri ottenere il certificato SSL deve puntare all'IP del tuo server pubblico. Useremo
example.com
. - Nginx installato.
Installazione di Certbot #
Utilizzeremo lo strumento certbot per ottenere e rinnovare i certificati.
Certbot è uno strumento completo e facile da usare che automatizza le attività per ottenere e rinnovare i certificati SSL Let's Encrypt e configurare i server Web per utilizzare i certificati.
Il pacchetto certbot è incluso nei repository Debian predefiniti. Esegui i seguenti comandi per installare certbot:
sudo apt update
sudo apt install certbot
Gruppo Generazione Dh (Diffie-Hellman) #
Lo scambio di chiavi Diffie–Hellman (DH) è un metodo per lo scambio sicuro di chiavi crittografiche su un canale di comunicazione non protetto.
Genereremo un nuovo set di parametri DH a 2048 bit per rafforzare la sicurezza:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Puoi anche modificare la dimensione fino a 4096 bit, ma la generazione potrebbe richiedere più di 30 minuti a seconda dell'entropia del sistema.
Ottenere un certificato SSL Let's Encrypt #
Per ottenere un certificato SSL per il dominio, utilizzeremo il plugin Webroot. Funziona creando un file temporaneo per la convalida del dominio richiesto nel ${webroot-path}/.well-known/acme-challenge
directory. Il server Let's Encrypt effettua richieste HTTP al file temporaneo per convalidare che il dominio richiesto venga risolto nel server su cui viene eseguito certbot.
Mapperemo tutte le richieste HTTP per .well-known/acme-challenge
in una singola directory, /var/lib/letsencrypt
.
Esegui i seguenti comandi per creare la directory e renderla scrivibile per il server Nginx:
sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp www-data /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
Per evitare la duplicazione del codice, creeremo due snippet che verranno inclusi in tutti i file di blocco del server Nginx.
Apri il tuo editor di testo e crea il primo snippet, letsencrypt.conf
:
sudo nano /etc/nginx/snippets/letsencrypt.conf
/etc/nginx/snippets/letsencrypt.conflocation ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
Il secondo snippet ssl.conf
include i cippatori consigliati da Mozilla, abilita OCSP Stapling, HTTP Strict Transport Security (HSTS) e applica poche intestazioni HTTP incentrate sulla sicurezza.
sudo nano /etc/nginx/snippets/ssl.conf
/etc/nginx/snippets/ssl.confssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
Una volta terminato, apri il file di blocco del server di dominio e includi il letsencrypt.conf
snippet come mostrato di seguito:
sudo nano /etc/nginx/sites-available/example.com.conf
/etc/nginx/sites-available/example.com.confserver {
listen 80;
server_name example.com www.example.com;
include snippets/letsencrypt.conf;
}
Crea un collegamento simbolico a sites-enabled
directory per abilitare il blocco del server di dominio:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
Riavvia il servizio Nginx per rendere effettive le modifiche:
sudo systemctl restart nginx
Ora sei pronto per ottenere i file del certificato SSL eseguendo il comando seguente:
sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
Se il certificato SSL viene ottenuto con successo, sul tuo terminale verrà stampato il seguente messaggio:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2020-02-22. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Modifica il blocco del server di dominio e includi i file del certificato SSL come segue:
sudo nano /etc/nginx/sites-available/example.com.conf
/etc/nginx/sites-available/example.com.confserver {
listen 80;
server_name www.example.com example.com;
include snippets/letsencrypt.conf;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
# . . . other code
}
La configurazione sopra indica a Nginx di reindirizzare da HTTP a HTTPS e da www alla versione non www.
Riavvia o ricarica il servizio Nginx per rendere effettive le modifiche:
sudo systemctl restart nginx
Apri il tuo sito web utilizzando https://
e noterai l'icona di un lucchetto verde.
Se esegui il test del tuo dominio utilizzando SSL Labs Server Test, otterrai un A+
grado, come mostrato nell'immagine qui sotto:
Certificato SSL Let's Encrypt con rinnovo automatico #
I certificati di Let's Encrypt sono validi per 90 giorni. Per rinnovare automaticamente i certificati prima che scadano, il pacchetto certbot crea un cronjob e un timer di sistema. Il timer rinnoverà automaticamente i certificati 30 giorni prima della scadenza.
Quando il certificato viene rinnovato dobbiamo anche ricaricare il servizio nginx. Apri il /etc/letsencrypt/cli.ini
e aggiungi la seguente riga:
sudo nano /etc/letsencrypt/cli.ini
/etc/cron.d/certbotdeploy-hook = systemctl reload nginx
Testare il processo di rinnovo automatico, eseguendo questo comando:
sudo certbot renew --dry-run
Se non ci sono errori, significa che il processo di rinnovo è andato a buon fine.