Apache, mod_md et Let’s Encrypt : simplissime

Dans l’un de ses commentaires sur ACME Stéphane Bortzmeyer cite le module md d’Apache comme solution pour l’obtention de certificat serveur. D’après la documentation ce module (expérimental) s’occupe de tout. Vérifions le par un test sur une installation fraîche de Debian.

Apache 2.4.41 – Debian Bullseye

Let’s encrypt ne propose plus d’inscription en ACME v1. Pour avoir le support d’ACME v2, il est nécessaire que le module md soit en version 2 disponible uniquement à partir de la version 2.4.41 d’Apache. Sous Debian, il faut être en version 11 ( Bullseye)

Installation du module

Un rapide tour dans le répertoire /etc/apache2/mods-enabled me montre que le module n’est pas activé. Activons le :

sudo a2enmod ssl
sudo a2enmod md

Une doc-root

Notre nouveau serveur virtuel pour le test doit disposer de sa propre doc root.

sudo mkdir /var/www/test-md

et dans ce répertoire je crée un fichier HTML simple nommé index.html

Une entrée DNS chez mon fournisseur

Mon nouveau « virtual host » s’appellera testmd.dync.fr. Je fais la configuration chez Gandi avec mon p’tit script.

Je lis les conditions générales d’utilisation de Let’s Encrypt.

Par défaut le module md soumet les demandes de certificats à Let’s Encrypt. Lisez la documentation. Si vous n’êtes pas d’accord choisissez une autre autorité – probablement payante.

La configuration Apache

Dans le répertoire /etc/apache2/sites-available/, sous root, je créé un nouveau fichier de configuration par exemple 010-test-mod-md.conf

MDCertificateAgreement accepted
LogLevel md:info
MDContactEmail xxx@yyyy.tld
MDCertificateAuthority https://acme-staging-v02.api.letsencrypt.org/directory
MDCAChallenges tls-alpn-01
MDomain testmd.dync.fr
<VirtualHost _default_:443>
        ServerName testmd.dync.fr
        DocumentRoot /var/www/test-md
        ErrorLog ${APACHE_LOG_DIR}/test-mod-error.log
        CustomLog ${APACHE_LOG_DIR}/test-mod-access.log combined
        SSLEngine on
        SSLOpenSSLConfCmd MinProtocol TLSv1.2
        Protocols h2 http/1.1 acme-tls/1
</VirtualHost>

La directive MDCertificateAuthority me permet de solliciter l’AC de test de LE, plutôt que celle de prod. Cette dernière est la valeur par défaut de cette directive, il suffit de la commenter pour utiliser l’AC de production.

La directive MDCAChallenges tls-alpn01 est optionnelle. Ici, je dis explicitement que je ne veux aucun autre type de défi. http-01 nécessite de donner accès au port 80 depuis internet, dns-01 nécessite de coder un script pour modifier la zone DNS concernée.

Relance d’Apache

J’active mon nouveau virtual host

sudo a2ensite 010-test-mod-md.conf

Je vérifie la configuration

sudo apachectl --testconfig

S’il n’y a aucune erreur, je redémarre le service Apache

sudo apachectl restart

Sous l’capot

En se connectant au nouveau site avec un navigateur, je me retrouve avec un certificat auto-signé. Un p’tit tour dans l’error log d’Apache me montre.

The Managed Domain testmd.dync.fr has been setup and changes will be activated on next (graceful) server restart.

Je redémarre le service Apache. Et hop, une connexion avec un navigateur me montre un certificat émis par LE.

Apache a créé une arborescence /etc/apache2/md dans laquelle on va retrouver les certificats.

Un peu plus propre

Les 5 premières lignes de la configuration Apache n’étant pas spécifiques au virtualhost, il est plus propre de les déplacer dans un fichier /etc/apache2/mods-available/md.conf et de l’activer par sudo a2dismod md puis sudo a2enmod md.

Pour aller plus loin

La documentation du module est claire, il est possible de ‘migrer’ ses certificats depuis certbot, choisir ses algorithmes de bi-clé, ou encore ajouter l’entête HSTS.

3 réponses sur “Apache, mod_md et Let’s Encrypt : simplissime”

  1. Bonjour,

    super article, mais je me pose une question, qu’en est t’il du renouvellement du certificat LE ?
    Apache le gère automatiquement ? Il faut redémarrer Apache pour qu’il check la date d’expiration ?

    1. Merci du compliment. D’après ce que dit la doc, Apache s’en débrouille. cf mdrenewwindow qui fixe la fenêtre de renouvellement du certificat, par défaut 33%. Les certificats LE étant valide 90j, s’il reste moins de 30j (33%) de validité, MD renouvèlera le certificat. Je vais modifier ce paramètre pour forcer le renouvellement dans quelques jours et voir…

    2. J’ai ajouté : MDRenewWindow 88d, le certificat a été renouvelé aujourd’hui – 2jour après l’émission à la minute près.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.