Dans ce tutoriel nous allons voir comment installer et configurer Let’s encrypt pour votre application Django sur un serveur debian 10.

Les pré-requis

Installons les dépendances nécessaires à Let’s encrypt

Afin de simplifier les commandes toutes les instructions suivantes sont à réaliser avec les droits root.

Pour utiliser Let’s encrypt sur notre serveur nous allons ajouter une source de données pour le gestionnaire de paquets apt, pour cela éditer le fichier /etc/apt/sources.list et ajouter en fin de fichier la ligne suivante :

deb http://ftp.debian.org/debian buster-backports main

Lancer ensuite les 2 commandes suivantes afin de respectivement mettre à jour la liste des paquets disponibles et installer le paquet certbot nécessaire pour simplifier l’installation de certificats Let’s encrypt :

apt update
apt install python-certbot-apache -t buster-backports

Mise en place de notre certificat ssl et particularité avec les instructions WSGI

Un petit point sur le fonctionnement du paquet certbot, afin de ne pas perdre vos configurations initiales, la commande certbot réalise une copie de votre virtualhost (port 80 – http) avant de réaliser des modifications afin de le passer en port 443 – https, ensuite en fonction des réponses que vous fournirez à la commande certbot ce dernier modifiera votre virtualhost (port 80) pour réaliser une redirection automatique vers le port 443 ou non.

Le souci que j’ai rencontré est que certaines directives dans notre virtualhost (port 80) ne peuvent être présentes et actives qu’une seule fois sur la totalité des virtualhosts et les directives WSGI font parties de ces directives, la duplication du virtualhost (port 80) entraîne donc une erreur pour Apache2 si nous ne prenons pas garde avant d’utiliser certbot.

Nettoyage de notre virtualhost (port 80 – http)

Pour nettoyer notre virtualhost (port 80), nous allons dans un premier temps commenter, avec un # en début de ligne, les directives WSGI suivantes : WSGIDaemonProcess, WSGIProcessGroup, WSGIScriptAlias

A partir de ce moment là si vous redémarrez votre apache2, votre application Django ne fonctionnera plus. Ne vous inquiétez pas nous allons remettre cela en ordre rapidement.

Demandons maintenant à certbot de nous générer et installer un certificat SSL

Pour cela rien de plus simple, en root, lancer la commande suivante (attention les crochets sont là seulement pour indiquer que vous pouvez précisez votre nom de domaine avec et sans www si vous souhaitez un certificat pour les 2, dans le cas où vous êtes sur un sous domaine la partie entre crochets et les crochets est à supprimer) :

certbot --apache -d votre_nom_de_domaine [-d www.votre_nom_de_domaine]

Si c’est votre premier certificat généré par certbot vous devrez répondre à quelques questions :

  1. Un email de contact
  2. A ou D pour indiquer si vous êtes d’accord avec les termes de la licence ou pas (A pour Agree et D pour Disagree)
  3. Y ou N pour indiquer si vous désirez partager votre email avec certbot

Enfin dans tous les cas (premier certificat ou non) vous devrez répondre sur le choix de la redirection automatique entre le http et le https, le choix 2 permet cette redirection.

Certbot va ensuite communiquer avec les serveurs de Let’s encrypt afin de générer les certificats demandés et les installer sur votre serveur et les configurer dans votre virtualhost (c’est beau l’automatisation), et tout ceci après avoir certifié que vous possédez bien le nom de domaine mentionné et que ce dernier pointe bien sur votre serveur.

Enfin certbot va recharger les configurations Apache2. Et là c’est le drame votre application n’est plus en ligne, rappelez vous nous avions commenté dans le virtualhost (port 80) les directives WSGI, elles le sont donc aussi dans notre virtualhost (port 443 – https).

Remettons en ligne notre projet Django en https

Nous devons donc maintenant dé-commenter ces 3 directives WSGIDaemonProcess, WSGIProcessGroup, WSGIScriptAlias dans le virtualhost copié puis modifié par certbot, ce virtualhost prend le même nom que votre virtualhot (port 80) suivi de -le-ssl.conf

Ensuite nous pouvons vérifier le bon état de l’art de nos virtualhosts avec : apache2ctl configtest

Si tout est au vert, lancer systemctl restart apache2

Enfin afin de vérifier sans rien modifier la possibilité du renouvellement vous pouvez lancer : certbot renew --dry-run

Pour information vous pouvez retrouver le script de mise à jour automatique du certificat dans le fichier /etc/cron.d/certbot, ce fichier permet de lancer très régulièrement la vérification de la date d’expiration du certificat et ainsi faire le renouvellement du certificat si nécessaire

Parfait nous arrivons au bout de notre tutoriel car nous avons dorénavant un projet Django qui tourne sur un serveur debian 10 avec apache2 et son module WSGI, tout ceci derrière un certificat Let’s encrypt auto-renouvelé. Si vous souhaitez revoir des étapes de ce tutoriel, rendez-vous sur le sommaire du tutoriel pour continuer votre lecture.

Image par Tumisu de Pixabay