Certificato SSL gratuito con Let’s Encrypt su un server Nginx

Certificato SSL gratuito con Let’s Encrypt su un server Nginx

Let’s Encrypt è un’autorità di certificazione che offre un modo semplice per ottenere e installare certificati TLS/SSL gratuiti, e quindi cifrare le richieste HTTPS sui tuoi server web. Il processo è semplificato da un programma chiamato Certbot, che automatizza quasi tutti i passaggi necessari. Tieni presente che Google, con il suo browser Chrome, vuole segnalare a tutti gli utenti i siti non sicuri, e questo può avere un impatto sul posizionamento.

In questo tutorial ti mostro come usare Let’s Encrypt per ottenere un certificato SSL gratuito per Nginx su Ubuntu 14.04. Vedremo anche come rinnovare automaticamente il certificato (un certificato Let’s Encrypt vale solo 90 giorni).

Passaggio 1, Installare Certbot

Che cos’è Certbot? Certbot attiva automaticamente l’HTTPS sul tuo sito installando i certificati Let’s Encrypt. Se non usi Nginx o Ubuntu 14.04, dai un’occhiata al loro sito: spiegano la procedura da seguire su ogni sistema per generare certificati SSL con Let’s Encrypt.

Cominciamo scaricando Certbot nella cartella /usr/local/sbin:

code
cd /usr/local/sbin
wget https://dl.eff.org/certbot-auto

Non dimenticare di rendere eseguibile il file:

code
chmod a+x /usr/local/sbin/certbot-auto

Passaggio 2, Ottenere un certificato

Perché la cartella sia raggiungibile da Certbot, modifichiamo al volo la configurazione di Nginx. Di default si trova in /etc/nginx/sites-available/default. Qui uso nano, ma sei libero di aprire il file con l’editor che preferisci:

code
nano /etc/nginx/sites-available/default

Dentro il blocco server, aggiungi:

code
server {

#votre configuration ...

location ~ /.well-known {
        allow all;
    }

}

Ti servirà la cartella pubblica del sito. Con il file di configurazione predefinito è /usr/share/nginx/html, con Laravel è /path/to/public/.
Controlla che non ci siano errori.

code
nginx -t

Se è tutto a posto, riavvia Nginx:

code
service nginx restart

Passaggio 3, Configurare TLS/SSL sul server nginx

Ora che conosciamo il percorso pubblico, possiamo usare il plugin Webroot per richiedere un certificato SSL. Qui indichiamo anche i nomi di dominio con l’opzione -d. Se vuoi un certificato valido per più domini (per esempio esempio.com e www.esempio.com), ricordati di elencarli tutti, cominciando dal dominio di primo livello (quindi esempio.com). Verifica anche di aver sostituito le parti evidenziate con il percorso webroot corretto e con i tuoi nomi di dominio:

code
certbot-auto certonly -a webroot --webroot-path=/votre/chemin/public -d exemple.com -d www.exemple.com

Certbot ti chiederà alcune informazioni, tra cui l’indirizzo email che servirà ad avvisarti quando il certificato sta per scadere. Più avanti vediamo insieme come rinnovarlo automaticamente.

I certificati

Una volta ottenuto il certificato, ti ritrovi con questi file:

  • cert.pem: il certificato del tuo dominio
  • chain.pem: il certificato Let’s Encrypt
  • fullchain.pem: cert.pem e chain.pem uniti
  • privkey.pem: la tua chiave privata.

Questi file finiscono in una sottocartella di /etc/letsencrypt/archive. Il client Let’s Encrypt crea però dei link simbolici verso i certificati più recenti nella cartella /etc/letsencrypt/live/votre_nom_de_domaine. Visto che questi link puntano sempre ai certificati più recenti, è questo il percorso da usare per fare riferimento al certificato in corso di validità.

Generare una chiave Diffie-Hellman

Per alzare ancora il livello di sicurezza, genera anche una chiave Diffie-Hellman a 2048 bit:

code
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Ci vogliono alcuni minuti, ma alla fine avrai il tuo file DH /etc/ssl/certs/dhparam.pem.

Ora che hai il certificato SSL, devi configurare il server Nginx perché lo usi.
Cominciamo riaprendo il nostro blocco server:

code
nano /etc/nginx/sites-available/default

Togliamo (o commentiamo) le righe seguenti, quelle che mettono il server in ascolto sulla porta 80 per le richieste HTTP:

code
#listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;

Per poi metterlo in ascolto sulla porta 443 per l’HTTPS:

code
listen 443 ssl;

Nel blocco server aggiungiamo anche il link simbolico creato prima, quello che punta ai certificati generati con il comando certbot-auto:

code
ssl_certificate /etc/letsencrypt/live/exemple.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/exemple.com/privkey.pem;

Aggiungiamo la configurazione SSL predefinita del nostro server:

code
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_prefer_server_ciphers on;
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_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

Infine, fuori dal blocco server principale, aggiungi questo nuovo blocco per reindirizzare l’HTTP (porta 80) verso l’HTTPS (porta 443).

code
server {
    listen 80;
    listen [::]:80;
    server_name exemple.com www.exemple.com;
    return 301 https://$host$request_uri;
}

Controlla che non ci siano errori nella configurazione:

code
nginx -t

Poi riavvia il server nginx:

code
service nginx restart

Passaggio 4, Rinnovo automatico del certificato

Come dicevo all’inizio, i certificati SSL scadono dopo 90 giorni: vanno rinnovati, e se ce ne dimentichiamo arriva un’email prima che il certificato Let’s Encrypt scada.

Per farlo rinnovare in automatico, aggiungiamo il comando certbot-auto renew nei task CRON del server.

code
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload

Ogni lunedì alle 2:30 il certificato viene rinnovato e alle 2:35 il server nginx viene ricaricato.

Conclusione

Ecco il tuo server web con un certificato SSL riconosciuto, firmato Let’s Encrypt: una buona alternativa ai certificati a pagamento. Molti hosting come OVH offrono l’SSL gratuitamente proprio grazie a Let’s Encrypt. È una scelta sensata, anche perché Google spinge poco a poco tutti i siti verso l’HTTPS.

fonte: digitalocean.com & wikipedia.org

···

Damien Flandrin Sviluppatore web dal 2010, creatore di Gekkode e di Email Impact. Ogni articolo è testato su un progetto reale prima della pubblicazione. Contatti
Newsletter

I nuovi test, tutorial e progetti, via e-mail.

Test riproducibili, codice versionato, risultati datati. Mai spam.