Certificat SSL signé gratuit avec Let’s Encrypt et nginx

Vous allez voir c’est très simple !

On va commencer par stopper nginx le temps de l’installation car Let’s Encrypt a besoin du port 80 pour fonctionner.

service nginx stop

On va mettre à jour le serveur et installer git

apt-get update && apt-get upgrade

Ensuite on va cloner le repo et se placer dans le répertoire :

cd /tmp
wget https://dl.eff.org/certbot-auto
chmod a+x ./certbot-auto
./certbot-auto --help all

Après cette étape il faut générer le certificat via let’s encrypt, avec une clé RSA de 4096bits pour les plus parano.
Vous pouvez retirer le paramètre « –rsa-key-size 4096 » la clé rsa sera de 2048bits (paramètre par défaut)
–standalone fait appel au serveur web de letsencrypt pour générer le certificat.

./certbot-auto --help
./certbot-auto certonly --standalone --rsa-key-size 4096

Différentes choses vont vous être demandées :
• Une adresse e-mail pour pouvoir vous transmettre et vous prévenir de l’expiration de vos certificats.
• Les domaines pour lesquels vous souhaitez générer le certificat (en général www.votresite.fr et votresite.fr)
• L’acceptation des conditions.

ou directement avec cette commande (sans interaction de notre part)

./certbot-auto certonly        \
  --standalone                 \
  --rsa-key-size 4096          \
  --agree-tos                  \
  --email john.doe@mondedie.fr \
  --domains mondedie.fr        \
  --domains www.mondedie.fr

Configuration de nginx avec le certificat

En premier lieu on va améliorer la configuration par défaut de nginx en suivant les recommandations le Mozilla.

Création du fichier params.conf

# nano /etc/nginx/ssl/params.conf

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

    ssl_ecdh_curve secp384r1;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA";

    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;

    ssl_stapling on;
    ssl_stapling_verify on;

    ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;

    resolver 8.8.8.8;

Note : la directive max age de Strict-Transport-Security correspond à 6 mois.

Attention: Avec HSTS, une mauvaise gestion de votre configuration SSL peut amener votre domaine à être complètement inaccessible pour vos utilisateurs, merci d’utiliser ce header en toute connaissance de cause. Wikipédia

On n’oublie pas d’inclure le fichier params.conf entre les balises http {} dans le fichier nginx.conf

# nano /etc/nginx/nginx.conf

http {
    include /etc/nginx/ssl/params.conf;
}

Les fichiers générés par Let’s Encrypt sont placés dans le répertoire /etc/letsencrypt.
Si tout s’est bien passé, le certificat et la clé que vous venez de générer se trouvent donc dans /etc/letsencrypt/live/www.votresite.fr.
Exemple :

root@server:/etc/letsencrypt/live/www.votresite.fr# ls -l                                                                                                              
total 0                                                                                                                                                                         
lrwxrwxrwx 1 root root 45 Nov  4 08:34 cert.pem -> ../../archive/www.votresite.fr/cert1.pem                                                                                
lrwxrwxrwx 1 root root 46 Nov  4 08:34 chain.pem -> ../../archive/www.votresite.fr/chain1.pem                                                                              
lrwxrwxrwx 1 root root 50 Nov  4 08:34 fullchain.pem -> ../../archive/www.votresite.fr/fullchain1.pem                                                                      
lrwxrwxrwx 1 root root 48 Nov  4 08:34 privkey.pem -> ../../archive/www.votresite.fr/privkey1.pem 

Ce qui nous intéresse ici ce sont ces deux fichiers : fullchain.pem et privkey.pem.

Dans votre fichier de configuration du vhost nginx (/etc/nginx/sites-enabled/rutorrent.conf si vous utilisez celui-ci), il suffit donc de renseigner l’emplacement de la chaine de certificat et de la clé.

Exemple

server {
    listen 443 ssl;
    server_name www.votresite.fr;
    ssl_certificate /etc/letsencrypt/live/www.votresite.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.votresite.fr/privkey.pem;

    ## etc
}


On redémarre nginx :

service nginx restart

Votre domaine est maintenant doté d’un certificat SSL signé par Let’s Encrypt.

Comment vérifier la configuration de nos certificats
Il y a quelques sites pour cela, en voici 2. Le but étant d’avoir un A+

Renouveler un certificat

service nginx stop
./certbot-auto renew
service nginx start

Ou alors vous pouvez regénérer de nouveau le certificat avec ./certbot-auto certonly (cf voir au dessus)