Let's Encrypt è un'autorità di certificazione gratuita, automatizzata e aperta sviluppata dall'Internet Security Research Group (ISRG). 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.
In questo tutorial, tratteremo i passaggi necessari per installare un certificato SSL Let's Encrypt gratuito su un server CentOS 7 che esegue Apache come server web. Useremo l'utilità certbot per ottenere e rinnovare i certificati Let's Encrypt.
Prerequisiti #
Assicurati di aver soddisfatto i seguenti prerequisiti prima di continuare con questo tutorial:
- Disponi di un nome di dominio che punta all'IP del tuo server pubblico. Useremo
example.com
. - Apache è installato e in esecuzione sul tuo server.
- Disponi di un host virtuale Apache per il tuo dominio.
- Le porte 80 e 443 sono aperte nel firewall.
Installa i seguenti pacchetti necessari per un server Web crittografato SSL:
yum install mod_ssl openssl
Installa Certbot #
Certbot è uno strumento che semplifica il processo per ottenere i certificati SSL da Let's Encrypt e abilitare automaticamente HTTPS sul tuo server.
Il pacchetto certbot è disponibile per l'installazione da EPEL. Se il repository EPEL non è installato sul tuo sistema, puoi installarlo utilizzando il seguente comando:
sudo yum install epel-release
Una volta abilitato il repository EPEL, installa il pacchetto certbot digitando:
sudo yum install certbot
Genera 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 per rafforzare la sicurezza:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
È possibile modificare la dimensione fino a 4096 bit, ma in tal caso 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 nostro 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 apache /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
Per evitare la duplicazione del codice, crea i seguenti due frammenti di configurazione:
/etc/httpd/conf.d/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/httpd/conf.d/ssl-params.confSSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
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
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off
Lo snippet sopra include i cippatori consigliati, abilita OCSP Stapling, HTTP Strict Transport Security (HSTS) e applica poche intestazioni HTTP incentrate sulla sicurezza.
Ricarica la configurazione di Apache per rendere effettive le modifiche:
sudo systemctl reload httpd
Ora possiamo eseguire lo strumento Certbot con il plug-in webroot e ottenere i file del certificato SSL digitando:
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 2018-12-07. 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
CentOS 7 viene fornito con la versione 2.4.6 di Apache, che non include il SSLOpenSSLConfCmd
direttiva. Questa direttiva è disponibile solo su Apache 2.4.8 successivo e viene utilizzata per la configurazione dei parametri OpenSSL come lo scambio di chiavi Diffie–Hellman (DH).
Dovremo creare un nuovo file combinato utilizzando il certificato Let's Encrypt SSL e il file DH generato. Per fare ciò, digita:
cat /etc/letsencrypt/live/example.com/cert.pem /etc/ssl/certs/dhparam.pem >/etc/letsencrypt/live/example.com/cert.dh.pem
Ora che tutto è impostato, modifica la configurazione dell'host virtuale del tuo dominio come segue:
/etc/httpd/conf.d/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
<If "%{HTTP_HOST} == 'www.example.com'">
Redirect permanent / https://example.com/
</If>
DocumentRoot /var/www/example.com/public_html
ErrorLog /var/log/httpd/example.com-error.log
CustomLog /var/log/httpd/example.com-access.log combined
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.dh.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.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.
Riavvia il servizio Apache per rendere effettive le modifiche:
sudo systemctl restart httpd
Ora puoi aprire 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 che scadano, creeremo un cronjob che verrà eseguito due volte al giorno e rinnoverà automaticamente qualsiasi certificato 30 giorni prima della sua scadenza.
Esegui crontab
comando per creare un nuovo cronjob che rinnoverà il certificato, creerà un nuovo file combinato che include la chiave DH e riavvierà apache :
sudo crontab -e
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload httpd"
Salva e chiudi il file.
Per testare il processo di rinnovo, puoi utilizzare il comando certbot seguito da --dry-run
interruttore:
sudo certbot renew --dry-run
Se non ci sono errori, significa che il processo di rinnovo è andato a buon fine.