Configurer let's encrypt pour Nginx avec Certbot

Nous allons ici faire une configuration multi-domaine pour rendre accéssible plusieurs sites web tous présent sur le même serveur. C'est à dire que le certificat sera valable pour domaine.com, www.domaine.com et web1.domaine.com. Cette approche peut être utile lors d'un service mutualisé.

Configurer Nginx

Dans un premier temps, nous avons besoin de Nginx :

apt install nginx

L'emplacement de nos site web seront les suivants:

mkdir /var/www/domaine.com
mkdir /var/www/web1.domaine.com

Nous définissions ces hôtes virtuelles accéssiblent via le port 80. Pour cela on modifie la configuration d'Nginx (Nous aurons pas besoin de la configuration de base) :

unlink /etc/nginx/sites-enabled/default
nano /etc/nginx/sites-enabled/domaine.com
domaine.com
server {
        listen 0.0.0.0:80 default_server;
        listen [::]:80 default_server;
        server_name domaine.com www.domaine.com;
 
        location ~ /.well-known {
                allow all;
        }
 
        root /var/www/domaine.com;
}
nano /etc/nginx/sites-enabled/web1.domaine.com
web1.domaine.com
server {
        listen 80;
        server_name web1.domaine.com;
 
        location ~ /.well-known {
                allow all;
        }
 
        root /var/www/web1.domaine.com;
}

Nous devons vérifier que la configuration est bonne :

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

Si tout c'est bien passé alors on poursuit en rechargent cette nouvelle configuration :

nginx -s reload

Lors de la création du certificat, Certbot aura juste besoin d'un accès depuis Internet au sites pour récupérer un fichier permettant de valider les futurs transactions.

Configurer Certbot

Maintenant que nos sites sont accéssibles depuis le port 80, attaquons-nous à l'outil de certification :

echo 'deb http://ftp.debian.org/debian jessie-backports main' > /etc/apt/sources.list.d/backports.list
apt update && apt install certbot -t jessie-backports

Pour les procédures suivantes, nous utiliserons l'utilisateur www-data pour conserver les droits d'accès aux dossiers /var/www/. Dans le cas contraire, lors du téléchargement d'un fichier présent dans le dossier .well-know du domaine ne pourra être lu.

Ainsi, il faut vérifier que les droits soient correcte dont les dossiers suivants :

chown -R www-data.www-data /etc/letsencrypt/live/
chown -R www-data.www-data /etc/ssl/certs/
chown -R www-data.www-data /var/log/letsencrypt/

On lui indique dans quel dossier il doit travailler en ajoutant la directive suivante :

nano /etc/letsencrypt/cli.ini
work-dir = /etc/letsencrypt

Nous déclarons enfin nos domaines avec leur emplacements respectif (en mode essai dans un premier temps pour voir s'il y a des erreurs) :

sudo -u www-data certbot certonly --webroot-path=/var/www/domaine.com/ -d domaine.com -d www.domaine.com --webroot-path=/var/www/web1.domaine.com/ -d web1.domaine.com --dry-run

Si l'on vous demande un authentification de type ACME CA, vous aurez le choix entre standalone (démarre un serveur en local) et webroot (utilise directement l'emplacement définis précédemment avec l'option webroot-path).

Si tout se passe bien au niveau des droits notamment, alors on valide la création :

sudo -u www-data certbot certonly --webroot-path=/var/www/domaine.com/ -d domaine.com -d www.domaine.com --webroot-path=/var/www/web1.domaine.com/ -d web1.domaine.com

Ensuite, nous créons un fort Diffie-Hellman qui va nous permettre d'avoir une bonne qualité de chiffrement :

sudo -u www-data openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Cette commande peut prendre du temps en fonction de la machine.

Anticipons la suite par la création de snippets :

nano /etc/nginx/snippets/ssl-domaine.com.conf
ssl_certificate /etc/letsencrypt/live/domaine.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domaine.com/privkey.pem;

Nous définissons la force de chiffrement dans le fichier suivant :

nano /etc/nginx/snippets/ssl-params.conf
ssl-params.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
 
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
 
ssl_dhparam /etc/ssl/certs/dhparam.pem;

Il reste a adapter la configuration de nos hôtes :

nano /etc/nginx/sites-enabled/domaine.com
domaine.com
server {
        listen 0.0.0.0:80 default_server;
        listen [::]:80 default_server;
        server_name domaine.com www.domaine.com;
        return 301 https://$server_name$request_uri;
}
 
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    include snippets/ssl-domaine.com.conf;
    include snippets/ssl-params.conf;
 
    root /var/www/domaine.com;
}
nano /etc/nginx/sites-enabled/web1.domaine.com
web1.domaine.com
server {
        listen 80;
        server_name web1.domaine.com;
        return 301 https://$server_name$request_uri;
}
 
server {
    listen 443 ssl;
    include snippets/ssl-domaine.com.conf;
    include snippets/ssl-params.conf;
 
    root /var/www/web1.domaine.com;
}

Nous devons vérifier que la configuration est bonne :

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

Si tout c'est bien passé alors on poursuit en rechargent cette nouvelle configuration :

nginx -s reload

Ceci fait, normalement sur nous site, nous sommes rediriger automatiquement en HTTPS. Pour vérifier la qualité du chiffrement, Renseigner vos site sur ssllabs.com.

Automatiser le renouvellement

Lors de la création du certificat, il est valide durant 3 mois. En dehors de ce delais, les sites deviennent innaccéssible vu qu'il n'est plus possible de déterminer sa validité. Il est alors inéressant de créer un tâche cron pour automatiser ce renouvellement :

crontab -e
  * * 1 */2 * /usr/bin/sudo -u www-data /usr/bin/certbot renew >> /var/log/letsencrypt/certbot-renew.log
  * * 1 */2 * /bin/systemctl reload nginx

Ainsi, notre certificat sera renouvellé tous les 1er jours à deux mois d'intervales.

Commandes disponible

  • Lister tous les certificats
/usr/bin/certbot certificates
  • Supprimer un certificat
/usr/bin/certbot delete --cert-name sous.domaine.com
  • Dernière modification: 2019/01/09 17:52