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.
In questo tutorial, forniremo istruzioni dettagliate su come installare un certificato SSL Let's Encrypt gratuito su CentOS 8 che esegue Nginx come server web. Mostreremo anche come configurare Nginx per utilizzare il certificato SSL e abilitare HTTP/2.
Prerequisiti #
Prima di procedere, assicurati di aver soddisfatto i seguenti prerequisiti:
- Hai un nome di dominio che punta al tuo IP pubblico. Useremo
example.com
. - Hai installato Nginx sul tuo server CentOS.
- Il tuo firewall è configurato per accettare connessioni sulle porte 80 e 443.
Installazione di Certbot #
Certbot è uno strumento da riga di comando gratuito che semplifica il processo per ottenere e rinnovare i certificati SSL Let's Encrypt e abilitare automaticamente HTTPS sul tuo server.
Il pacchetto certbot non è incluso nei repository CentOS 8 standard, ma può essere scaricato dal sito Web del fornitore.
Esegui il seguente wget
comando come utente root o sudo per scaricare lo script certbot in /usr/local/bin
directory:
sudo wget -P /usr/local/bin https://dl.eff.org/certbot-auto
Una volta completato il download, rendi eseguibile il file:
sudo chmod +x /usr/local/bin/certbot-auto
Generazione Strong Dh (Diffie-Hellman) Gruppo #
Lo scambio di chiavi Diffie–Hellman (DH) è un metodo per lo scambio sicuro di chiavi crittografiche su un canale di comunicazione non protetto.
Genera un nuovo set di parametri DH a 2048 bit digitando il seguente comando:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Se lo desideri puoi modificare la lunghezza della chiave 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 che 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.
Per semplificare, mapperemo tutte le richieste HTTP per .well-known/acme-challenge
in una singola directory, /var/lib/letsencrypt
.
I seguenti comandi creeranno la directory e la renderanno scrivibile per il server Nginx.
sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp nginx /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
Per evitare la duplicazione del codice, crea i seguenti due snippet che verranno inclusi in tutti i file di blocco del server Nginx:
sudo mkdir /etc/nginx/snippets
/etc/nginx/snippets/letsencrypt.conflocation ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
/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;
Lo snippet sopra include i cippatori consigliati da Mozilla, abilita OCSP Stapling, HTTP Strict Transport Security (HSTS) e applica poche intestazioni HTTP incentrate sulla sicurezza.
Una volta creati gli snippet, apri il blocco del server di dominio e includi il letsencrypt.conf
snippet, come mostrato di seguito:
server {
listen 80;
server_name example.com www.example.com;
include snippets/letsencrypt.conf;
}
Ricarica la configurazione di Nginx per rendere effettive le modifiche:
sudo systemctl reload nginx
Esegui lo strumento certbot con il plug-in webroot per ottenere i file del certificato SSL per il tuo dominio:
sudo /usr/local/bin/certbot-auto certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
Se è la prima volta che invochi certbot
, lo strumento installerà le dipendenze mancanti.
Una volta ottenuto il certificato SSL, certbot stamperà 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-03-12. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto 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
Ora che hai i file del certificato, puoi modificare i blocchi del tuo server di dominio come segue:
/etc/nginx/conf.d/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
}
Con la configurazione di cui sopra, stiamo forzando HTTPS e reindirizzando la versione www alla versione non www.
Infine, ricarica il servizio Nginx per rendere effettive le modifiche:
sudo systemctl reload nginx
Ora apri il tuo sito web usando 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 della scadenza, crea un cronjob che verrà eseguito due volte al giorno e rinnoverà automaticamente qualsiasi certificato 30 giorni prima della scadenza.
Usa il crontab
comando per creare un nuovo cronjob:
sudo crontab -e
Incolla la seguente riga:
0 */12 * * * root test -x /usr/local/bin/certbot-auto -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && /usr/local/bin/certbot-auto -q renew --renew-hook "systemctl reload nginx"
Salva e chiudi il file.
Per testare il processo di rinnovo, puoi utilizzare il comando certbot seguito da --dry-run
interruttore:
sudo ./certbot-auto renew --dry-run
Se non ci sono errori, significa che il processo di rinnovo del test è andato a buon fine.