Sommaire

Let's Encrypt avec défi DNS

Introduction

J’ai actuellement chez moi (derrière ma Box), deux équipements utilisant des certificats fournis par Let’s Encrypt (LE). Pour la génération de ces certificats, j’utilise le défi “HTTP-01” de LE. Le renouvellement implique donc que le port HTTP (80) soit redirigé vers ces équipements. Or, je ne peux le faire que vers une seule machine à la fois !
De ce fait, seul un équipement est automatiquement renouvelé. Pour l’autre, je change temporairement les règles de NAT sur ma Box avant de renouveler le certificat.
Historiquement, je n’avais pas de domaine mais j’utilisais le DDNS de No-IP. Maintenant que j’en ai un et que j’ai un certificat qui expire dans deux semaines (sur mon serveur non exposé sur le port 80), je me suis dis que c’est la bonne occasion de mettre en place le défi DNS (DNS-01) sur ce serveur.
Pour une explication des différents défis, je vous renvoie sur la documentation Let’s Encrypt à ce sujet (en français 🐔).

Mon service DNS est géré par OVH qui est un des sponsors de Let’s Encrypt. De ce fait, OVH fait partis de la liste des fournisseurs avec lequel la validation par DNS est facile.

Du coup, ce tutoriel (que j’écris en live) montre comment j’ai fait fonctionner cela. Nous allons donc dans un premier temps générer les accès à l’API d’OVH qui va permettre à notre serveur de générer l’enregistrement TXT nécessaire pour le challenge DNS.
Ainsi, nous ferons l’installation et la configuration de cela sur mon serveur.

API OVH

Pour cela, OVH à mis une documentation en ligne.

On va donc sur la page de création de clés européennes : ovh-eu

/img/2020/2020-05-02-lets-encrypt-avec-defi-dns/Screenshot_1.png
Page de génération des clés de l’API d’OVH

Pour les informations à renseigner, la documentation fournit les informations pour donner les droits sur la zone.
J’ai donc mis en place les droits suivants :

1
2
3
4
GET /domain/zone/*
PUT /domain/zone/*
POST /domain/zone/*
DELETE /domain/zone/*
/img/2020/2020-05-02-lets-encrypt-avec-defi-dns/Screenshot_2.png
Création des clés de l’API d’OVH
Avertissement
Mon adresse e-mail n’as pas fonctionné j’ai du mettre mon ID de compte (peut-être parce que j’utilise la double authentification…).

On obtient donc un résultat du type :

/img/2020/2020-05-02-lets-encrypt-avec-defi-dns/Screenshot_3.png
Clés de l’API d’OVH

Avec ces clés, on ne peut donc qu’effectué des actions pour le domaine pkm.jp.

Échec

Donner les droits pour toute la zone, je trouve que c’est un peu trop, j’ai alors essayé de le faire pour un seul et unique domaine mais sans succès.
Les règles d’accès que j’avais essayé pour le domaine kanto.pkm.jp étaient les suivantes :

1
2
3
4
5
6
7
GET /domain/zone/
GET /domain/zone/kanto.pkm.jp/status
GET /domain/zone/kanto.pkm.jp/record
GET /domain/zone/kanto.pkm.jp/record/*
POST /domain/zone/kanto.pkm.jp/record
POST /domain/zone/kanto.pkm.jp/refresh
DELETE /domain/zone/kanto.pkm.jp/record/*

Ce qui m’as donné comme erreur dans la suite :

Error determining zone identifier for scrample.xyz: 403 Client Error: Forbidden for url: https://eu.api.ovh.com/1.0/domain/zone/scrample.xyz/status. (Are your Application Key and Consumer Key values correct?)

Partie Serveur

Installation de Certbot
1
2
3
apt install python3-pip
pip3 install certbot
pip3 install certbot-dns-ovh

Il faut donc créer un fichier de la forme suivante :

1
2
3
4
5
6
# OVH API credentials used by Certbot
# Only for kanto.pkm.jp
dns_ovh_endpoint = ovh-eu
dns_ovh_application_key = bulbizarre
dns_ovh_application_secret = salameche
dns_ovh_consumer_key = carapuce

J’ai décidé de sauvegarder cela dans un fichier pkm.jp.ini dans /etc/ovh-api. Il faut ensuite donné les droits 0600 à ce fichier : chmod 600 /etc/ovh-api/pkm.jp.ini

On génère donc le certificat en précisant le domaine et le fichier de configuration :

1
2
3
4
certbot certonly \
  --dns-ovh \
  --dns-ovh-credentials /etc/ovh-api/pkm.jp.ini \
  -d kanto.pkm.jp

Forcément, c’était trop simple pour que sa fonctionne :

certbot: error: unrecognized arguments: –dns-ovh-credentials

J’ai alors enlevé cette option :

1
certbot certonly --dns-ovh -d kanto.pkm.jp

Ce qui me donne l’interaction suivante :

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-ovh, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for kanto.pkm.jp
Input the path to your OVH credentials INI file (Enter ‘c’ to cancel):

J’inscris donc le chemin du fichier /etc/ovh-api/pkm.jp.ini et je valide.

Waiting 30 seconds for DNS changes to propagate
Waiting for verification…
Cleaning up challenges

IMPORTANT NOTES:

  • Congratulations! Your certificate and chain have been saved at:
    […]

Finalement, cela à fonctionner 📣 !

Normalement, la configuration que l’on a faite en interaction est sauvegardée dans le fichier /etc/letsencrypt/renewal/pkm.jp.conf ce qui veut dire que le renouvellement et déjà programmé (on verra dans environ deux mois).

On peut testé le renouvellement pour être sur qu’il est bien non-interactive avec l’option de test --dry-run :

1
certbot renew --dry-run

Conclusion

J’ai tant bien que mal trouvé la solution pour avoir des certificats pour des équipements qui ne dont pas exposée sur le port 80. Il faudrait maintenant que je fasse évoluer cette commande pour quelle redémarre les services associés. Mon problème est que j’ai plusieurs services qui utilise ce certificat de manière indépendante : Apache2, Grafana, HomeAssistant. Il faut donc que je les redémarre tous…
Bon, vu que je souhaite tout passé sur Traefik, pour l’instant je vais le faire à la main.