Let's Encrypt avec acme tiny et nginx

Avec la sortie de Chrome 68 les sites non HTTPS seront marqués comme non sûr par le navigateur de Google. Si vous avez une partie authentification sur votre site web, il vaudrait mieux le passer en HTTPS pour éviter que les mots de passe se baladent en clair sur le réseau.

Acme-tiny est un programme python qui facilite l'installation d'un certificat signé par Let's Encrypt, pesant à peine 200 lignes de code il est simple la procédure prends moins de 10 minutes

D'abord on crée une clé qui va servir à signer tous les échanges avec les serveurs de Let's Encrypt


openssl genrsa 4096 > account.key

Ensuite on génère la clé du domaine (exemple.com pour ... l'exemple) :


openssl genrsa 4096 > domain.key

On crée un certificat de requête de signature (exemple.com ... pour l'exemple)


openssl req -new -sha256 -key domain.key -subj "/CN=exemple.com" > domain.csr

Attention : si vous souhaitez gérer exemple.com et www.exemple.com c'est cette ligne qu'il faut taper :


openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:exemple.com,DNS:www.exemple.com")) > domain.csr

Le «challenge» est une requête faite par Let's Encrypt sur votre serveur pour vérifier que vous avez le contrôle du nom de domaine, il consiste à héberger sur votre serveur un nonce, un nombre aléatoire généré par Let's Encrypt utilisé qu’une seule fois et que Let's Encrypt doit retrouver en requetant votre serveur.
Voici la config nginx de base pour faire ça :


server
{
        listen 80;
        server_name   exemple.com;

        location /.well-known/acme-challenge{
                alias /usr/share/nginx/www/acme-challenges/;
                try_files $uri =404;
        }
}


Dans cet exemple vous devez avoir créé le répertoire vide «/usr/share/nginx/www/acme-challenges/» où acme-tiny va placer le nonce.
Puis vous pouvez lancer la commande :


python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/challenges/ > ./signed_chain.crt

voici le genre de message qui devrait s'afficher :


Parsing account key...
Parsing CSR...
Found domains: exemple.com
Getting directory...
Directory found!
Registering account...
Already registered!
Creating new order...
Order created!
Verifying exemple.com...
exemple.com verified!
Signing certificate...
Certificate signed!

Vous êtes maintenant en possession d'un certificat signé nommé «signed_chain.crt»

Optionnellement vous pouvez créer une clé qui va servir à sécuriser l’échange des clés (Diffie–Hellman key exchange) entre le serveur que vous paramétrez et les clients via cette ligne ( le répertoire «/etc/nginx/ssl/» doit exister). Selon la puissance du serveur ça peut être plus ou moins long.


openssl dhparam -outform pem -out /etc/nginx/ssl/dhparam2048.pem 2048

Au final le fichier de config de nginx pour exemple.com devrait ressembler à ça :


server
{
        listen 443;
        server_name     exemple.com;

        ssl on;
        ssl_certificate /etc/letsencrypt/exemple.com/signed_chain.crt;
        ssl_certificate_key /etc/letsencrypt/exemple.com/domain.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';
        ssl_dhparam /etc/nginx/ssl/dhparam2048.pem;
        ssl_session_cache shared:TLS:2m;

        # reste de la config à adapter

}