Let's Encrypt è un'autorità di certificazione creata dall'Internet Security Research Group (ISRG). Fornisce certificati SSL gratuiti tramite un processo completamente automatizzato progettato per eliminare la creazione, la convalida, l'installazione e il rinnovo manuali dei certificati.
I certificati emessi da Let's Encrypt sono validi per 90 giorni dalla data di emissione e oggi sono considerati affidabili da tutti i principali browser.
Questo tutorial mostra come installare un certificato SSL Let's Encrypt gratuito su Debian 10, Buster che esegue Apache come server web. Mostreremo anche come configurare Apache 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
. - Apache 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
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.
Eseguire il comando seguente per generare una nuova chiave DH a 2048 bit:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Se lo desideri, puoi 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 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 in cui viene eseguito certbot.
Per semplificare, 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 Apache.
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, crea i seguenti due frammenti di configurazione:
/etc/apache2/conf-available/letsencrypt.confAlias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/"
<Directory "/var/lib/letsencrypt/">
AllowOverride None
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>
/etc/apache2/conf-available/ssl-params.confSSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite 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
SSLHonorCipherOrder off
SSLSessionTickets off
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options SAMEORIGIN
Header always set X-Content-Type-Options nosniff
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
Il codice nello snippet sopra utilizza i cippatori consigliati da Mozilla, abilita OCSP Stapling, HTTP Strict Transport Security (HSTS) e applica poche intestazioni HTTP incentrate sulla sicurezza.
Assicurati che entrambi mod_ssl
e mod_headers
sono caricati:
sudo a2enmod ssl
sudo a2enmod headers
Abilita il modulo HTTP/2, che renderà i tuoi siti più veloci e robusti:
sudo a2enmod http2
Abilita i file di configurazione SSL:
sudo a2enconf letsencrypt
sudo a2enconf ssl-params
Ricarica la configurazione di Apache per rendere effettive le modifiche:
sudo systemctl reload apache2
Utilizza lo strumento Certbot con il plug-in webroot per ottenere i file del certificato SSL :
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, 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-04-02. 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"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- 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, modifica la configurazione dell'host virtuale del tuo dominio come segue:
/etc/apache2/sites-available/example.com.conf<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
Protocols h2 http/1.1
<If "%{HTTP_HOST} == 'www.example.com'">
Redirect permanent / https://example.com/
</If>
DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# Other Apache Configuration
</VirtualHost>
Con la configurazione sopra, stiamo forzando il reindirizzamento HTTPS e dalla versione www alla versione non www. Fell libero di regolare la configurazione in base alle tue esigenze.
Ricarica il servizio Apache per rendere effettive le modifiche:
sudo systemctl reload apache2
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 voto A+, come mostrato di seguito:
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, il pacchetto certbot crea un cronjob che viene eseguito due volte al giorno e rinnoverà automaticamente qualsiasi certificato 30 giorni prima della sua scadenza.
Una volta rinnovato il certificato dobbiamo anche ricaricare il servizio Apache. Aggiungi --renew-hook "systemctl reload apache2"
al /etc/cron.d/certbot
file in modo che assomigli al seguente:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --renew-hook "systemctl reload apache2"
Per testare il processo di rinnovo, usa il certbot --dry-run
interruttore:
sudo certbot renew --dry-run
Se non ci sono errori, significa che il processo di rinnovo è andato a buon fine.