Rendere sicuro Nginx con Let’s Encrypt su Ubuntu 14.04
Introduzione
Let’s Encrypt è una nuova Autorità di Certificazione (CA) che mette a disposizione un sistema semplice per ottenere ed installare gratuitamente i certificati TLS/SSL, rendendo in tal modo possibile la cifratura HTTPS sui web server. Let’s Encrypt semplifica tale processo fornendo un client, letsencrypt
, che tenta di automatizzare la maggior parte (se non tutti) i passaggi necessari. Al momento, dato che Let’s Encrypt è ancora in open beta, l’intero processo di acquisizione ed installazione di un certificato è completamente automatizzato solo sui web server Apache. Tuttavia, a prescindere dalla scelta del web server, Let’s Encrypt può essere usato per ottenere facilmente un certificato SSL gratuito che può essere installato manualmente.
In questo tutorial vi mostreremo come utilizzare Let’s Encrypt al fine di ottenere un certificato SSL gratuito ed utilizzarlo con Nginx su Ubuntu 14.04. Vedremo anche come rinnovare automaticamente il certificato SSL. Se si sta utilizzando un diverso web server , è sufficiente seguire la documentazione del server per imparare ad utilizzare il certificato.
Prerequisiti
Prima di seguire questo tutorial avrete bisogno di un paio di cose.
Dovreste avere Ubuntu Server 14.04 con un utente non root che ha i privlegi di sudo
. Potete imparare come impostare un tale account utente seguendo i passaggi 1-3 del tutorial sulla configurazione del server iniziale per Ubuntu 14.04 .
È necessario possedere o avere il controllo del nome a dominio del quale si desidera utilizzare il certificato. Se non si dispone già di un nome a dominio, è possibile registrarne uno tramite uno dei tanti registrar di nomi a dominio presenti sul mercato (ad esempio Namecheap, GoDaddy, ecc).
Se non l’avete già, assicuratevi di creare un A Record che punti il vostro dominio all’indirizzo IP pubblico del server. Ciò è necessario a causa del modo in cui Let’s Encrypt convalida che si è proprietari del dominio per il quale è stato emesso un certificato. Ad esempio, se si desidera ottenere un certificato per example.com
, tale dominio va risolto sul vostro server affinché il processo di convalida funzioni. Il nostro setup userà example.com
e www.example.com
per i nomi a dominio, dunque sono necessari entrambi i record DNS.
Una volta in possesso di tutti i prerequisiti, passiamo all’installazione del client Let’s Encrypt.
Fase 1 – Installare il client Let’s Encrypt
Il primo passo per utilizzare Let’s Encrypt al fine di ottenere un certificato SSL è quello di installare letsencrypt
sul server. Al momento, il modo migliore per installare Let’s Encrypt è semplicemente quello di clonarlo dal repository ufficiale su GitHub. In futuro sarà probabilmente disponibile tramite un gestore di pacchetti.
Installare Git e bc
Installiamo Git e bc, di modo che si possano clonare i repository di Let’s Encrypt.
Aggiornate il gestore dei pacchetti del server con questo comando:
$ sudo apt-get update
Quindi installate i pacchetti git
e bc
con apt-get:
$ sudo apt-get -y install git bc
Con git
e bc
installati possiamo scaricare facilmente letsencrypt
clonando il repository su GitHub.
Clonare Let’s Encrypt
Ora possiamo clonare il repository di Let’s Encrypt in /opt
con questo comando:
$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Ora dovremmo avere una copia del repository letsencrypt
nella directory /opt/letsencrypt
.
Fase 2 – Ottenere un certificato
Let’s Encrypt fornisce diversi modi per ottenere i certificati SSL, attraverso vari plugin. A differenza del plugin per Apache, di cui si parla in un diverso tutorial, la maggior parte dei plugin vi aiuterà soltanto ad ottenere un certificato che, per poterlo utilizzare, sarà necessario configurare manualmente il web server. I plugin che ottengono solo i certificati e non li installano sono indicati come “autenticatori” perché sono utilizzati per autenticare se ad un server debba essere rilasciato un certificato.
Vi mostreremo come utilizzare il plugin Webroot per ottenere un certificato SSL.
Come usare il plugin Webroot
Il plugin Webroot funziona inserendo uno speciale file nella cartella /.well-known
nella document root, che può essere aperta dal servizio Let’s Encrypt (tramite il web server) per la convalida . A seconda della configurazione, potrebbe essere necessario consentire esplicitamente l’accesso alla directory /.well-known
.
Se non avete ancora installato Nginx, fatelo con il seguente comando:
$ sudo apt-get install nginx
Per assicurarsi che la directory sia accessibile da Let’s Encrypt per la convalida, facciamo un rapido cambiamento nella configurazione di Nginx. Di default, questa si trova in /etc/nginx/sites-available/default
. Per modificarla useremo nano
:
$ sudo nano /etc/nginx/sites-available/default
All’interno del blocco server aggiungete questo blocco location:
location ~ /.well-known {
allow all;
}
Andiamo a vedere quale document root è impostata cercando la direttiva root
, dato che è richiesto il suo path per poter utilizzare il plugin Webroot. Se si utilizza il file di configurazione di default, la root sarà /usr/share/nginx/html
.
Salvate ed uscite.
Ricaricate Nginx con questo comando:
$ sudo service nginx reload
Ora che conosciamo il webroot-path
possiamo usare il plugin Webroot per richiedere un certificato SSL con i sottostanti comandi. Qui specifichiamo anche i nostri nomi a dominio con l’opzione -d
. Se si vuole un unico certificato per lavorare con più nomi a dominio (ad esempio example.com
e www.example.com
), assicuratevi di includerli tutti. Assicuratevi inoltre di sostituire le parti evidenziate con l’appropriato path di Webroot e il/i nome/i a dominio:
$ cd /opt/letsencrypt
$ ./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com
Nota: Let’s Encrypt richiede i privilegi di superuser, per cui vi verrà richiesto di inserire la password nel caso non abbiate usato sudo
di recete.
Dopo l’inizializzazione di letsencrypt
, verranno richieste alcune informazioni. Le istruzioni esatte possono variare a seconda se prima si sia utilizzato Let’s Encrypt o meno, ma la prima volta troverete questi passaggi.
Al prompt, inserite un indirizzo di posta elettronica che verrà utilizzato per le comunicazioni e per il recupero della chiave nel caso vada persa:
È necessario quindi accettare l’accordo di sottoscrizione di Let’s Encrypt. Selezionate Agree:
Se il tutto ha funzionato correttamente, dovreste vedere in output un messaggio che assomiglia a questo:
IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to sammy@digitalocean.com
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-15. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
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 Let's
Encrypt so making regular backups of this folder is ideal.
- If like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Vanno notati il path e la data di scadenza del certificato, che sono stati evidenziati nell’output dell’esempio.
Nota per i Firewall : Se si riceve un errore come Failed to connect to host for DVSNI challenge
, potrebbe essere necessario configurare il firewall del server per consentire il traffico TCP sulle porte 80
e 443
.
Nota: Se il dominio usa il routing di un servizio di DNS come CloudFlare, è necessario disabilitarlo temporaneamente fino a che non si abbia ottenuto il certificato.
File del certificato
Dopo aver ottenuto il certificato, vi troverete i seguenti file codificati con PEM:
- cert.pem: Il certificato del vostro dominio
- chain.pem: Il certificato chain di Let’s Encrypt
- fullchain.pem:
cert.pem
echain.pem
combinati - privkey.pem: La chiave privata del vostro certificato
È importante che siate a conoscenza della posizione dei file del certificato che sono stati appena creati, in modo da poterli utilizzare nella configurazione del web server. I file stessi sono collocati in una sottodirectory in /etc/letsencrypt/archive
. Tuttavia, Let’s Encrypt crea link simbolici delle più recenti versioni dei file del certificato nella directory /etc/letsencrypt/live/your_domain_name
. Poiché i link punteranno sempre ai più recenti file del certificato, è questo il percorso che si dovrebbe usare per fare riferimento ai file del certificato.
È possibile verificare che i file esistono eseguendo questo comando (sostituendo il nome a dominio):
$ sudo ls -l /etc/letsencrypt/live/your_domain_name
L’output dovrebbe mostrare i quattro file del certificato menzionati in precedenza. In breve il web server sarà configurato per utilizzare fullchain.pem
quale file del certificato e privkey.pem
come keyfile del certificato.
Generare gruppi Diffie-Hellman forti
Per aumentare ulteriormente la sicurezza, si dovrebbe generare anche un gruppo Diffie-Hellman forte. Per generare un gruppo di 2048 bit, utilizzate questo comando:
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Questa operazione potrebbe richiedere alcuni minuti, ma quando è terminata si avrà un gruppo DH forte in /etc/ssl/certs/dhparam.pem
.
Fase 3 – Configurare TLS/SSL sul web server (Nginx)
Ora che si dispone di un certificato SSL, per poterlo usare è necessario configurare il web server Nginx.
Modificate la configurazione di Nginx che contiene il blocco server. Anche in questo caso, di default è in /etc/nginx/sites-available/default
:
$ sudo nano /etc/nginx/sites-available/default
Trovate il blocco server
, commentatelo oppure eliminate le righe che configurano tale blocco in ascolto sulla porta 80. Nella configurazione di default, le seguenti due linee devono essere cancellate:
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
Andremo invece a configurare il blocco server in ascolto sulla porta 443 con SSL abilitato. All’interno del blocco server {
aggiungete le seguenti righe, ma sostituite tutte le istanze di example.com
con il vostro dominio:
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
Ciò permette al vostro server di usare SSL e di utilizzare il certificato SSL di Let’s Encrypt che abbiamo ottenuto in precedenza.
Per consentire solo i protocolli e cifrari SSL più sicuri ed utilizzare il gruppo Diffie-Hellman forte che abbiamo generato, aggiungete le seguenti righe allo stesso blocco server:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
Infine, al di fuori del blocco server originale (che è in ascolto su HTTPS, porta 443), aggiungete questo blocco server per reindirizzare HTTP (porta 80) su HTTPS. Assicuratevi di sostituire la parte evidenziata con il vostro nome a dominio:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Salvate ed uscite.
Per far sì che i cambiamenti abbiano luogo, dovete ricaricare Nginx:
$ sudo service nginx reload
Da questo momento Nginx sta usando il Certificato TLS/SSL di Let’s Encrypt. A questo punto, è opportuno verificare che il certificato TLS/SSL funzioni visitando il vostro dominio tramite HTTPS da un browser web.
Per vedere i punteggi di configurazione del server è possibile utilizzare il report dei Qualys SSL Labs:
https://www.ssllabs.com/ssltest/analyze.html?d=example.com
Questa configurazione SSL dovrebbe fornire un rating A+.
Fase 4 – Configurare il rinnovo automatico
I certificati di Let’s Encrypt sono validi per 90 giorni ma si consiglia di rinnovarli ogni 60 giorni per consentire un certo margine di errore. Al momento in cui è stato scritto questo articolo, il rinnovo automatico non è ancora disponibile come funzionalità del client stesso, ma è possibile rinnovare manualmente i certificati eseguendo il client di Let’s Encrypt con l’opzione renew
.
Per attivare il processo di rinnovo per tutti i domini installati, eseguite questo comando:
$ /opt/letsencrypt/letsencrypt-auto renew
Dato che abbiamo installato il certificato di recente, il comando controllerà solo la data di scadenza e stamperà un messaggio che informa che il certificato non è ancora soggetto a rinnovo. L’output dovrebbe essere simile a questo:
Checking for new version...
Requesting root privileges to run letsencrypt...
/root/.local/share/letsencrypt/bin/letsencrypt renew
Processing /etc/letsencrypt/renewal/example.com.conf
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
Si noti che se si è creato un certificato aggregato con più domini, in output verrà mostrato solo il nome del dominio di base, ma il rinnovo deve essere valido per tutti i domini inclusi nel certificato.
Un modo pratico per garantire che i certificati non diventino obsoleti è quello di creare un cronjob che esegua periodicamente il comando di rinnovo automatico. Dal momento che il rinnovo prima controlla la data di scadenza ed esegue il rinnovo solo se il certificato è a meno di 30 giorni di distanza dalla scadenza, si è al sicuro quando per esempio si crea un cronjob che viene eseguito ogni settimana o anche ogni giorno.
Modifichiamo il crontab per creare un nuovo job che eseguirà il comando di rinnovo ogni settimana. Per modificare il crontab dell’utente root, eseguite:
$ sudo crontab -e
Aggiungete le seguenti righe:
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log 35 2 * * 1 /etc/init.d/nginx reload
Salvate ed uscite. Ciò creerà un nuovo cronjob che eseguirà il comando letsencrypt-auto renew
ogni lunedi mattina alle 02:30 e ricaricherà Nginx alle 02:35 (di modo che venga usato il certificato rinnovato). L’output prodotto dal comando verrà reindirizzato in un file di log situato in /var/log/le-renewal.log
.
Per ulteriori informazioni su come creare e pianificare i processi con cron, è possibile dare un’occhiata alla guida Come usare cron per automatizzare le attività in una VPS.
Fase 5 – Aggiornare il client Let’s Encrypt (opzionale)
Ogni volta che sono disponibili nuovi aggiornamenti per il client, è possibile aggiornarne la copia locale eseguendo un git pull
dall’interno della directory di Let’s Encrypt:
$ cd /opt/letsencrypt
$ sudo git pull
Questo scaricherà dal repository tutte le modifiche recenti, aggiornando il vostro client.
Conclusioni
Questo è tutto! Il web server sta ora utilizzando il certificato TLS/SSL di Let’s Encrypt per servire in modo sicuro i contenuti HTTPS.