Piero V.

Let's Encrypt

Let’s Encrypt è un’iniziativa intrapresa da alcune aziende e fondazioni importanti nel campo di internet, come Mozilla, Cisco e Akamai, unite nell’Internet Security Research Group.

Il loro obiettivo è fornire un modo semplice per ottenere chiavi crittografiche e installarle in modo da offrire HTTPS velocemente e senza passare attraverso complicati sistemi.

Al momento il progetto è in fase di public beta, ovvero chiunque può registrarsi e ottenere delle chiavi per il proprio sito e funziona comunque molto bene.

Era da tempo che volevo installare un certificato per HTTPS, così ne ho aprofittato, dunque potete provare a connettervi alla versione HTTPS del sito, sempre non l’abbiate già fatto.

Installazione su Debian Jessie

L’installazione non è ancora semplicissima, in quanto il pacchetto si trova solo nel ramo experimental. Le opzioni quindi sono di installarlo tramite i repository in pinning, oppure il download manuale sempre del .deb, oppure ancora l’installazione per le distribuzioni generiche.

Io ho scelto la seconda, in modo da avere il maggior numero di dipendenze possibili sotto forma di pacchetti che si aggiornano da soli.

Alcuni pacchetti hanno bisogno comunque dei repo di jessie-backports (python-cryptography) o di testing (python-acme, python-configargparse, python-dialog). Personalmente ho deciso di abilitare solo jessie-backports e scaricare manualmente gli altri pacchetti. Per eventuali pacchetti più aggiornati di quelli di cui inserisco il link, vi consiglio di consultare le liste dei pacchetti di Debian.

I comandi di installazione sono questi (vanno eseguiti da root, in una cartella vuota creata allo scopo):

# Installazione di Python Cryptography dai backports, perché la versione di Jessie è troppo vecchia
apt-get install -t jessie-backports python-cryptography
# Download di alcuni pacchetti pacchetti da Stretch ed Experimental (i link potrebbero essere rotti)
wget http://ftp.fr.debian.org/debian/pool/main/p/python-acme/python-acme_0.1.0-1_all.deb
wget http://ftp.fr.debian.org/debian/pool/main/p/python-configargparse/python-configargparse_0.10.0-1_all.deb
wget http://ftp.it.debian.org/debian/pool/main/p/python2-pythondialog/python-dialog_3.3.0-2_amd64.deb
wget http://ftp.fr.debian.org/debian/pool/main/p/python-letsencrypt/python-letsencrypt_0.1.0-1_all.deb
wget http://ftp.it.debian.org/debian/pool/main/p/python-letsencrypt/letsencrypt_0.1.0-1_all.deb
# Installazione di tutti i deb scaricati
dpkg -i *.deb
# Installazione delle dipendenze
apt-get install -f
# Impostazione delle dipendenze come installate automaticamente per andare bene in caso di rimozione
apt-mark auto python-cryptography python-acme python-configargparse python-dialog python-letsencrypt
# Eliminazione dei file scaricati che non servono più
rm *.deb

Ottenimento delle chiavi e installazione su Nginx

Sul mio VPS uso Nginx, che purtroppo richiede un’impostazione manuale.

Sempre da root dobbiamo dare questo comando:

letsencrypt certonly --webroot -w document_root -d dominio -d dominio2 -w doc_root_2 -d dominio3

per esempio, nel mio caso, ho dato questo comando (mi trovavo già nella document root):

letsencrypt certonly --webroot -w ./ -d pierovdfn.it -d www.pierovdfn.it

A questo punto il programma creerà i file richiesti in /etc/letsencrypt/live/dominio.

I permessi nel mio caso erano già corretti, ma ho preferito dare ugualmente questo comando:

chmod 640 /etc/letsencrypt/archive/dominio/privkey1.pem

Letsencrypt inoltre crea una directory .well-known nella document root, che può essere rimossa senza problemi.

A questo punto l’ultima cosa da fare è cambiare la configurazione di Nginx.

Per prima cosa bisogna creare il file per prevenire l’attacco Logjam all’algoritmo Diffie Hellman:

cd /etc/nginx
openssl dhparam -out dhparam.pem 2048
chmod 600 dhparam.pem

Poi bisogna aggiungere alcune linee ai vari blocchi server esistenti in /etc/nginx/sites-available:

	listen 443 ssl;
	listen [::]:443 ssl ipv6only=on;
	ssl_certificate /etc/letsencrypt/live/dominio/cert.pem;
	ssl_certificate_key /etc/letsencrypt/live/dominio/privkey.pem;
	ssl_trusted_certificate /etc/letsencrypt/live/dominio/chain.pem;

	ssl_session_timeout 1d;
	ssl_session_cache shared:SSL:50m;
	ssl_session_tickets off;

	ssl_dhparam /etc/nginx/dhparam.pem;

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	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:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-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_prefer_server_ciphers on;

	add_header Strict-Transport-Security max-age=15768000;

Infine va riavviato Nginx:

service nginx restart

Effettivamente è molto semplice, peccato che i certificati durino poco tempo (3 mesi). Però per ovviare a questo problema si può tranquillamente mettere il comando di rinnovo in un crontab, come consigliato dalla documentazione di Let’s Encrypt stessa.

La configurazione di Nginx può sembrare lunga. Effettivamente sono strettamente necessarie le prime 5 righe, ma le altre servono per avere la migliore crittografia possibile, al prezzo di non supportare più piattaforme antiche come Java 6 e IE 6.

Bibliografia

Un commento