Il y a quelques années, j’ai écrit l’article Création de certificats SSL gratuits avec Let’s Encrypt pour des domaines chez OVH. Son contenu est toujours d’actualité… à un détail près.
Ces derniers jours, j’ai pu voir que mes certificats SSL n’étaient plus mis à jour. Un problème empêchait Let’s Encrypt de les générer, alors j’ai regardé de plus près.
Je suis tombé sur ce bug ouvert sur le GitHub de Certbot. Il semblerait que depuis 3 semaines, l’API d’OVH a été modifiée sans prévenir. Une requête qui retournait auparavant un code 200 (sans corps de réponse) retourne désormais un code 204 (avec un corps de réponse vide). La différence est subtile, mais suffisante pour faire planter une brique qui s’attend dorénavant à recevoir un flux JSON.
Bon, vous savez ce que je pense d’OVH (du bien autant que du mal, en essayant d’être lucide), mais là ce n’est vraiment pas une bonne idée de casser quelque chose d’aussi essentiel aujourd’hui que Let’s Encrypt. Bref.
J’ai trouvé deux solutions pour contourner le problème. La première est un hack rapide, la seconde est une réinstallation un peu particulière.
Le hack rapide
Cette solution s’inspire d’un commit sur la bibliothèque Lexicon, censé corriger le problème. Il a toutefois fallu une petite modification sous Ubuntu 22.04 (sûrement parce que ce n’est pas la dernière version de la bibliothèque qui est fournie par le système).
Ouvrez le fichier /usr/lib/python3/dist-packages/lexicon/providers/ovh.py
À la fin du fichier, remplacez la ligne suivante :
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">return result.json()</mark>
Langage du code : JavaScript (javascript)
Par ces lignes :
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">try:
return result.json()
except Exception:
return None</mark>
Langage du code : JavaScript (javascript)
(pensez à indenter le code correctement sinon ça ne fonctionnera pas, c’est du Python)
Une fois la modification effectuée, une simple commande letsencrypt renew
a suffi pour renouveler les certificats correctement.
La réinstallation
L’autre solution est de réinstaller complètement Certbot (le logiciel client Let’s Encrypt), comme l’explique la documentation de l’Electronic Frontier Foundation. Pour cela, il ne faut pas utiliser les packages mis à disposition par le système, ils ne sont pas à jour. Il faut utiliser les packages snap.
Il faut commencer par effacer les packages préalablement installés :
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">$ sudo apt remove certbot python3-certbot python3-certbot-dns-ovh</mark>
Langage du code : HTML, XML (xml)
Puis installer le snap Certbot :
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">$ sudo snap install --classic certbot</mark>
Langage du code : HTML, XML (xml)
Puis créer un lien symbolique pour faciliter l’accès au programme :
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">$ sudo ln -s /snap/bin/certbot /usr/bin/certbot</mark>
Langage du code : HTML, XML (xml)
Puis exécuter la commande suivante :
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">$ sudo snap set certbot trust-plugin-with-root=ok</mark>
Langage du code : JavaScript (javascript)
Puis installer le plugin DNS :
<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-purple-color">$ sudo snap install certbot-dns-ovh</mark>
Langage du code : HTML, XML (xml)
Une fois que tout cela est fait, la commande certbot renew
devrait fonctionner. Sur un vieux serveur, j’avais plusieurs installations de Let’s Encrypt qui traînaient (packages système, pip…), et j’ai dû utiliser le chemin complet vers le programme : /snap/bin/certbot renew