[Tuto] Let’s Encrypt

Let’s Encrypt est une autorité de certification qui a été lancer le 3 décembre 2015 par Mozilla. Elle permet à n’importe qui de créer simplement et gratuitement un certificat SSL/TLS. Chacun peut ainsi en quelques manipulations de rajouter un au site qu’il héberge un certificat x509 reconnu par la plupart des navigateurs. Cela passe par le client officiel, mais aussi par d’autres solutions qui utilisent le protocole créé pour l’occasion : ACME

Dans cette procédure, je vais vous montré comment mettre en place un certificat TLS en utilisant Let’s Encrypt.
Let’s Encrypt fonctionne sur la plupart des distributions Linux et fonctionne également sur FreeBSD.

1 – Installation de Let’s Encrypt
2 – Mise en place du certificat
3 – Configuration de Nginx pour le HTTPS
4 – Renouvellement

.

1 – Installation de Let’s Encrypt

Nous allons dans un premier temps, récupérer le client Let’s Encrypt sur le dépôt GitHub officiel

$ sudo apt-get update
$ sudo apt-get install git

$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

$ cd /opt/letsencrypt
$ sudo git pull

.

2 – Mise en place du certificat

Let’s Encrypt dispose d’un mode automatique qui va installer les dépendances nécessaires à l’outil et mettre en place les certificats en fonction de votre configuration serveur. Cette installation automatique fonctionne dans le cadre d’un serveur Web apache mais reste expérimentale pour nginx. Nous allons donc utiliser let’s encrypt pour la génération de certificat seulement.

Afin de vérifier que vous êtes bien le possesseur du nom de domaine pour lequel vous souhaitez obtenir un certificat, Let’s Encrypt va générer un fichier sur votre serveur et va ensuite essayer d’y accéder depuis leur serveur. Pour distribuer ce fichier, il est possible d’utiliser un serveur Web interne à Let’s Encrypt, mais on peut aussi choisir d’utiliser notre propre serveur Web (ici nginx). Nous allons modifier la configuration de notre virtual host nginx et rajouter les lignes suivantes :

server {
# Virtual Host
listen IPv4:80;
listen [IPv6]:80;
server_name exemple.domain.tld;
# Vérification Let's Encrypt
location ~ /\.well-known/acme-challenge {
    root /var/www/monsite
    allow all;
}
# Interdire l'accès au dotfiles
location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
}

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

$ sudo systemctl restart nginx

Une fois que nginx est configuré pour renvoyer les fichiers contenus dans ce dossier on peut alors utiliser le module webroot pour générer le certificat :

$ sudo mkdir /var/www/monsite
$ sudo /opt/letsencrypt/letsencrypt-auto certonly --rsa-key-size 4096 --webroot --webroot-path /var/www/monsite -d domain.tld -d exemple.domain.tld

Les certificats générés, ainsi que les clés privées sont stockés dans le dossier /etc/letsencrypt/live/. Nous allons réorganisés l’emplacement des certificats pour faciliter leurs gestions.

$ sudo mkdir -p /etc/ssl/{issued,dhparam,private}
$ sudo ln -s /etc/letsencrypt/live/domain.tld/fullchain.pem /etc/ssl/issued/domain.tld.crt
$ sudo ln -s /etc/letsencrypt/live/domain.tld/privkey.pem /etc/ssl/private/domain.tld.key

Vous pouvez aussi générer Diffie-Helman Parameters

$ sudo openssl dhparam -out /etc/ssl/dhparam/domain.tld.dhparam4096.pem 4096

.

3 – Configuration de Nginx pour le HTTPS

Adaptez votre configuration comme l’exemple ci-dessous :

server {
    # Virtual Host
    listen IPv4:80;
    listen [IPv6]:80;
    server_name exemple.domain.tld;

    # Let's Encrypt
    location ~ /\.well-known/acme-challenge {
        root /var/www/monsite;
        allow all;
    }

    # Redirection HTTPS
    location / {
        return 301 https://$server_name$request_uri;
    }
}

server {
    # Virtual Host
    listen IPv4:443 ssl http2;
    listen [IPv6]:443 ssl http2;
    server_name exemple.domain.tld;

    # Dossier racine du site
    root /var/www/monsite;

    # Fichier index
    index index.php index.html index.htm;

    # Forcer UTF-8
    charset utf-8;

    # LOG
    access_log  /var/log/nginx/exemple-access.log combined buffer=32k;
    error_log   /var/log/nginx/exemple-error.log;

    # Certificats
    ssl_dhparam                 /etc/ssl/dhparam/domain.tld.dhparam4096.pem;
    ssl_certificate             /etc/ssl/issued/domain.tld.crt;
    ssl_certificate_key         /etc/ssl/private/domain.tld.key;
    ssl_trusted_certificate     /etc/ssl/issued/domain.tld.crt;

    # Option TLS
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_prefer_server_ciphers on;
    ssl_ecdh_curve secp384r1;
    ssl_protocols TLSv1.2;
    ssl_session_cache shared:SSL:10m;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver IPDNS1 IPDNS2 valid=300s;
    resolver_timeout 10m;

    # Hearders
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";

    [...]
    [...]
}

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

$ sudo systemctl restart nginx

.

4 – Renouvellement

Les certificats proposés par Let’s Encrypt sont valables pour une durée de 90 jours. Il faudra donc penser à les renouveler avant la fin de cette période. Pour cela on peut utiliser la commande :

$ sudo /opt/letsencrypt/letsencrypt-auto renew

Cette commande renouvelle les certificats sans interaction de la part de l’utilisateur, vous pouvez donc la rajouter dans les tâches récurrentes de votre système afin de renouveler le certificat au bout d’une certaine période de temps. Cette commande vérifie la date d’expiration avant de lancer la procédure alors on peut la programmer de manière hebdomadaire :

$ sudo crontab -e
30 3 * * 0 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/letsencrypt/renewal.log

3 thoughts on “[Tuto] Let’s Encrypt

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *