Générer des certificats SSH wildcard

Certificats SSH. Je suis actuellement chez OVH pour tous ce qui concerne les noms de domaine, et je n’avais jamais fait attention que l’on pouvait générer un certificat SSH pour l’ensemble des sous-domaines d’une adresse en une seule action.

Il existait aujourd’hui un plugin officiel qui permet, une fois en place, d’automatiquement générer et renouveler des certificats wildcard ou non.

Ici j’utilise le plugin OVH, mais il en existe d’autres (CloudFlare, DigitalOcean, Linode, AWS etc…).

Installation des outils

Avant de faire quoi que ce soit, il faut faire une sauvegarde du répertoire /etc/letsencrypt dans le cas ou vous auriez installé une ancienne version. En effet apt purge certbot effacera ce répertoire et vos certificats avec.

# avant tout on s'assure d'avoir pip
sudo apt install python3-pip

# ensuite on installe certbot et le plugin ovh avec pip
sudo apt install certbot
sudo pip install certbot-dns-ovh --break-system-packages

Il faut installer la version 3 de pip, l’installation via python2.x pose des problèmes au niveau des dépendances.

Dernier point, la gestion des logs, Certbot log le résultat de chaque commande dans /var/log/letsencrypt. Cependant, pip ne configure aucune politique de rotation des logs. Pour que ces derniers ne s’accumulent pas dans le répertoire, on va configurer logrotate pour qu’il les zippe puis qu’il les efface après 6 mois.

Donc on va créer un nouveau fichier de config /etc/logrotate.d/certbot avec le contenu suivant :

/var/log/letsencrypt/*.log {
    monthly
    rotate 6
    compress
    delaycompress
    notifempty
    missingok
    create 640 root adm
}

Création des accès à l’API OVH

Deuxième étape, création d’un accès à l’API d’OVH afin que le plugin puisse modifier des enregistrements pour vérifier que le domaine est bien à nous. Pour cela, rendez-vous sur la page de création de Token API.

Renseignez les droits comme ceci :

certificats SSH wildcard

Assurez-vous de bien définir le token avec une validité illimitée et surtout ne pas oublier de remplacer {domain.ext} par votre nom de domaine. Attention, il s’agit toujours du nom de domaine racine sans sous-domaine.

Après validation, il faut créer un fichier pour que Certbot puisse accéder aux identifiants de l’API. Enregistrez ce fichier où bon vous semble. Pour ma part, c’est: ~/.ovhapi

dns_ovh_endpoint = ovh-eu
dns_ovh_application_key = xxx
dns_ovh_application_secret = xxx
dns_ovh_consumer_key = xxx

Bien sûr il faut remplacer les valeurs de chaque champs par les informations obtenues lors de la création du token. Assurez-vous ensuite de modifier les droits d’accès de ce fichier en 600, sans quoi Certbot ne sera pas content.

sudo chmod 600 ~/.ovhapi

Génération des certificats SSH

Une fois que tout cela est en place, on peut générer les certificats. Je vais prendre exemple.com en exemple, mais bien entendu, ne pourrons fonctionner que les domaines gérés sur votre compte OVH.

# ces deux certificats sont distincts mais ils seront regroupés en un seul fichier
sudo certbot certonly --dns-ovh --dns-ovh-credentials ~/.ovhapi --agree-tos --email mon@email.fr -d exemple.com -d *.exemple.com

Ces commandes devront être utilisées pour renouveler les certificats au minimum tous les 90 jours afin de ne pas laisser les certificats périmer. Pour rendre la chose automatique, on va utiliser un petit script qui va prendre place.

sudo nano /usr/local/sbin/renewCerts.sh

Voila le script

#!/bin/bash

sudo certbot certonly --dns-ovh --dns-ovh-credentials ~/.ovhapi --non-interactive --agree-tos --email mon@email.fr -d exemple.com -d *.exemple.com

Executer ce script une fois par mois avec crontab et vous aurez des certificats SSH toujours à jour.

22 4 5 * * /usr/local/sbin/renewCerts.sh > /dev/null 2>&1

Et voilà, vous avez maintenant une validation par DNS avec renouvellement automatique, laquelle vous permet d’obtenir des certificats wildcard et de générer des certificats même si les DNS du domaine pointent vers une autre ip. Ça peut être utile en cas de load balancing par DNS par exemple.