Générer des certificats SSL gratuits avec Let's Encrypt

Générer des certificats SSL gratuits avec Let's Encrypt

Depuis le début du mois de Décembre, une nouvelle autorité de certificats est apparue et propose un service entièrement gratuit.

Let’s Encrypt est un projet appartenant à la Linux Foundation et possède des partenaires ayant un impact majeur sur Internet. On parle de Mozilla, Google, Cisco, Akamai, Facebook, OVH et d’autres entreprises. La particularité de Let’s Encrypt est que la génération des certificats est gratuite, valables 90 jours et permet une installation automatique des certificats sur votre serveur Web. Let’s Encrypt fonctionne uniquement sur Linux pour l’instant.

Dans cet article, je vous propose l’installation et la configuration de Let’s Encrypt avec Nginx. La config d’Nginx permet d’avoir une note A+ sur SSLLabs ou d’autres outils de tests.

Installation et configuration de Let’s Encrypt

Premièrement, il est nécessaire d’installer git (si vous n’avez pas Nginx, installez-le ou bien compilez-le pour avoir droit au protocole SPDY ou HTTP/2) :

apt install git

Ensuite, il faut cloner le dépôt Let’s Encrypt disponible sur Github à cette adresse : https://github.com/letsencrypt/letsencrypt :

git clone https://github.com/letsencrypt/letsencrypt

La première étape consiste à lier une adresse e-mail et accepter le TOS en utilisant la commande :

./letsencrypt-auto --email monemail@domain.tld --agree-tos

Ensuite, il faut générer le certificat pour le ou les domaines :

./letsencrypt-auto certonly -d domain.tld -d domaine.tld

Note : Chaque domaine doit obligatoirement pointer vers l’adresse IP du serveur.
Note 2 : Il est possible de générer le certificat et l’installer directement en utilisant la commande ./letsencrypt-nginx mais cette fonctionnalité est pour le moment expérimentale.

Ensuite il faut générer le fichier dhparams.pem pour Nginx, pour cela je vous recommande de vous faire du café et attendre…. longtemps 😀

cd /etc/ssl/certs openssl dhparam -out dhparam.pem 4096

Vous pouvez réduire la clé à 2048 bits mais je vous recommande vraiment en 4096 bits.

Après quelques heures d’attentes, la clé est enfin prête ! Il faut maintenant configurer Nginx !

Configuration de Nginx

La configuration d’Nginx est relativement simple. Commençons sans plus attendre !

Fichier /etc/nginx/site-available/monsite:

server {
    listen 443 ssl spdy; # Ajoutez SPDY ou http2 si vous avez le support d'une des deux fonctionnalités
    server_name monsite.fr www.monsite.fr;
    root /var/www/dossier;
    index index.html index.htm index.php;

    add_header Strict-Transport-Security 'max-age=31536000';

    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_certificate /etc/letsencrypt/live/monsite.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/monsite.fr/privkey.pem;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 +SHA !aNULL !eNULL !LOW !MD5 !EXP !DSS !PSK !SRP !kECDH !CAMELLIA !RC4 !SEED';
    ssl_dhparam /etc/ssl/certs/dhparam1.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    keepalive_timeout 70;

    [...] # Reste de votre configuration (PHP, Directory, etc ...)
}

Note : Si vous souhaitez utiliser plusieurs sites, sachez qu’il est impossible de mettre plusieurs fois ssl_session_cache shared:SSL:10m et ssl_session_timeout 10m. Il faudra donc concevoir un fichier ssl.conf dans /etc/nginx/conf.d/ avec toutes les informations SSL (sauf celles du certificat).

Vous pouvez désormais relancer Nginx avec la commande :

service nginx reload

Vous pouvez désormais tester votre configuration sur SSLLabs ou sur CryptCheck et voir les points à améliorer.

Si vous souhaitez rediriger tout le trafic HTTP vers HTTPS, il suffit de modifier le serveur HTTP de votre site en rajoutant les lignes suivantes à votre vhost HTTP :

    return 301 https://$server_name$request_uri; 
    location / { 
        proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
    }

Et voilà ! Votre site possède désormais un certificat signé valable 90 jours. Pensez à faire une tâche cron avant l’expiration du certificat ou à faite-le à la main tous les 3 mois 😉

Soyez fiers ! Vous avez réussi à installer un certificat Let’s Encrypt sur votre serveur Nginx ! Si vous avez le moindre problème, question, n’hésitez pas à lire la documentation disponible ici ou bien d’en parler dans les commentaires 😉