Rendere sicuro Nginx con Let’s Encrypt su Ubuntu 14.04

17 dic 2015 Nginx , Sicurezza , Let’s Encrypt Ubuntu

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.

Nginx con Let Encrypt TLS / SSL Certificate e Auto-rinnovamento

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:

Da aggiungere al blocco server SSL
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:

pronta Email

È necessario quindi accettare l’accordo di sottoscrizione di Let’s Encrypt. Selezionate Agree:

Diamo Crittografare accordo abbonato

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 e chain.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:

Cancellazioni nella configurazione di Nginx
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:

Aggiunte nella configurazione di Nginx – 1 di 3
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:

Aggiunte alla configurazione di Nginx – 2 di 3
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:

Aggiunte alla configurazione di Nginx – 3 di 3
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:

  Da un browser web:
 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.

Facebooktwitterredditpinterestlinkedinmail

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

*