SSLmentor

Certificats TLS/SSL de qualité pour sites Web et projets Internet.

Lego & ACME WildCard

Lego & ACME WildCard

Client ACME Lego - WildCard SSL

Un guide détaillé pour le déploiement d'un certificat SSL WildCard (étoile) via le client ACME Lego et la validation API DNS avec l'hébergement web VEDOS. La procédure est destinée aux certificats de type example.com et *.example.com, où le renouvellement doit être automatique sans saisie manuelle des enregistrements TXT. Le guide utilise un certificat ACME de l'autorité de certification Certum. Le certificat utilisé ne sert que d'exemple – le principe de fonctionnement et la procédure de déploiement ACME sont les mêmes pour toutes les autorités de certification.

Le guide utilise une syntaxe vérifiée sur Lego 5.2.2. Lego v5 a modifié certains paramètres par rapport aux versions plus anciennes, donc en cas d'erreur telle que flag provided but not defined, vérifiez la syntaxe correcte à l'aide de lego accounts register --help, lego run --help ou lego --help.

Concepts de base

  • ACME – protocole pour l'émission et le renouvellement automatisés des certificats SSL/TLS.
  • Lego – un client ACME écrit en Go. Il peut effectuer la validation DNS via de nombreux fournisseurs DNS (liste des fournisseurs DNS pris en charge).
  • DNS-01 – validation via l'enregistrement DNS TXT _acme-challenge. Elle est requise pour les certificats WildCard.
  • EAB kid + hmac – détails External Account Binding (EAB) fournis par l'autorité de certification. Ils relient ACME client à un compte ou à un produit.
  • VEDOS WAPI – l'interface API de VEDOS par laquelle Lego crée et supprime les enregistrements DNS TXT.
  • Service systemd - un fichier de configuration qui indique au système Linux comment démarrer une application et la maintenir en fonctionnement même après un redémarrage du serveur.

Dans tous les exemples présentés, remplacez le domaine example.com par votre propre domaine.

Installation de Lego

apt update
apt install -y curl tar

cd /tmp
LEGO_URL=$(curl -s https://api.github.com/repos/go-acme/lego/releases/latest | sed -n 's/.*"browser_download_url": "\(.*linux_amd64.tar.gz\)".*/\1/p' | head -n1)
echo "$LEGO_URL"
curl -L -o lego.tar.gz "$LEGO_URL"
tar -xzf lego.tar.gz
install -m 0755 lego /usr/local/bin/lego
lego --version

Après une installation réussie, nous recommandons de supprimer les fichiers temporaires.

rm -f /tmp/lego /tmp/lego.tar.gz /tmp/LICENSE /tmp/CHANGELOG.md
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
apt update Met à jour la liste des paquets.
apt install -y curl tar Installe les outils pour télécharger et extraire Lego.
LEGO_URL=... Trouve l'URL du dernier paquet de version Linux amd64.
curl -L -o lego.tar.gz Télécharge l'archive Lego.
tar -xzf lego.tar.gz Extrait l'archive.
install -m 0755 lego /usr/local/bin/lego Installe Lego comme commande système exécutable.
lego --version Vérifie la version installée de Lego.

Fournisseur d'API DNS

Ce guide utilise l'API DNS du registraire de domaines Vedos, qui propose une API pour gérer le DNS des domaines enregistrés. Pour l'hébergement web Vedos, vous devez activer WAPI et également renseigner les adresses IP autorisées ainsi que le mot de passe WAPI.

Le client LEGO prend en charge des centaines d'autres fournisseurs DNS.
Vous pouvez trouver leur liste sur le site web de LEGO - liste des fournisseurs DNS pris en charge.

Adresses IP du serveur VPS

curl -4 ifconfig.me
curl -6 ifconfig.me
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
curl -4 ifconfig.me Affiche l'adresse IPv4 publique du serveur, qui doit être autorisée dans VEDOS WAPI.
curl -6 ifconfig.me Affiche l'adresse IPv6 publique du serveur, si le VPS en utilise une. Il est conseillé d'autoriser également cette adresse dans VEDOS WAPI.

Dans le champ Adresses IP autorisées, saisissez toutes les adresses IP sortantes de votre serveur, généralement à la fois IPv4 et IPv6. Les valeurs sont séparées par un espace. VEDOS n'autorise les requêtes API que depuis les adresses IP indiquées.
Important : si vous n'autorisez que l'IPv4 et qu'une requête API sort en IPv6, l'émission du certificat peut réussir, mais le nettoyage des enregistrements TXT échouera avec l'erreur Access not allowed from this IP address.

Valeurs recommandées pour le fournisseur DNS VEDOS

Champ Valeur recommandée
Activer WAPI Activé
Adresses IP autorisées L'adresse IPv4 publique du VPS et éventuellement l'adresse IPv6
Méthode de notification File d'attente POLL
Protocole préféré JSON
Mot de passe Le mot de passe WAPI généré, et non le mot de passe d'administration ordinaire

Apache, webroot

La configuration de base d'Apache est un élément d'appoint. La validation DNS s'effectue via l'API DNS, et non via HTTP, mais le vhost Apache est nécessaire pour servir le site web après l'émission du certificat.

›› Afficher/Masquer la section

Avant l'exécution, remplacez la valeur example.com dans la ligne DOMAIN="example.com" par votre propre domaine sans l'astérisque. La variable $DOMAIN est ensuite utilisée dans les commandes suivantes pour les chemins, le vhost Apache et la page de test.

cd /var/www
apt update
apt install -y apache2
systemctl enable --now apache2
a2enmod rewrite headers ssl
systemctl reload apache2

DOMAIN="example.com"
mkdir -p /var/www/$DOMAIN/public
chown -R www-data:www-data /var/www/$DOMAIN
chmod -R 755 /var/www/$DOMAIN
echo "OK $DOMAIN" > /var/www/$DOMAIN/public/index.html
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
cd /var/www Se place dans le répertoire où les fichiers web sont habituellement stockés.
apt update Met à jour la liste des paquets.
apt install -y apache2 Installe Apache ; -y confirme automatiquement l'installation.
systemctl enable --now apache2 Active Apache au démarrage du serveur et le lance en même temps.
a2enmod rewrite headers ssl Active les modules pour les redirections, les en-têtes et le HTTPS.
DOMAIN="example.com" Définit la variable de domaine. Remplacez example.com par votre propre domaine.
mkdir/chown/chmod/echo Crée le webroot, définit les permissions pour Apache et enregistre une simple page de test.

vhost HTTP pour l'apex et les sous-domaines :


cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
    ServerName $DOMAIN
    ServerAlias *.$DOMAIN

    DocumentRoot /var/www/$DOMAIN/public
    <Directory /var/www/$DOMAIN/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
    CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF

a2ensite $DOMAIN.conf
apache2ctl configtest
systemctl reload apache2
curl -I http://$DOMAIN
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
cat > ... <<EOF Écrit un nouveau vhost HTTP Apache dans un fichier dans sites-available.
ServerName $DOMAIN Le domaine principal de l'hôte virtuel.
ServerAlias *.$DOMAIN Permet la prise en charge de n'importe quel sous-domaine de premier niveau.
DocumentRoot Le répertoire à partir duquel Apache sert le contenu.
a2ensite $DOMAIN.conf Active le vhost.
apache2ctl configtest Vérifie la syntaxe de la configuration Apache.
curl -I http://$DOMAIN Vérifie la réponse HTTP du domaine.

Fichiers de configuration de Lego

L'approche recommandée pour Lego v5 est de stocker les paramètres dans un fichier de configuration. Le service systemd n'a alors pas besoin de contenir une longue commande avec les domaines, le fournisseur DNS et les hooks.

Fichier de configuration .env

Le fichier .env est un fichier de configuration texte dans lequel sont stockées des variables d'environnement, par exemple des identifiants d'accès, des clés API ou des paramètres d'application. Pour plus de clarté, vous pouvez nommer le fichier provider-domain.env. Le fichier vedos-example.com.env contiendra les identifiants de connexion VEDOS WAPI, nous le stockons donc dans /etc/lego et lui appliquons des permissions restreintes.

DOMAIN="example.com"

mkdir -p /etc/lego/$DOMAIN
nano /etc/lego/vedos-$DOMAIN.env
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
DOMAIN="example.com" Définit le domaine pour les commandes suivantes. Remplacez par votre propre domaine.
mkdir -p /etc/lego/$DOMAIN Crée le répertoire pour les données et la configuration Lego du domaine donné.
nano /etc/lego/vedos-$DOMAIN.env Ouvre le fichier pour les variables de l'API VEDOS.

Dans la configuration ci-dessous, remplacez WEDOS_LOGIN par votre identifiant VEDOS et WEDOS_WAPI_PASSWORD par le mot de passe généré dans VEDOS WAPI. Vous pouvez laisser les valeurs de timeout et d'intervalle telles quelles.

WEDOS_USERNAME='WEDOS_LOGIN'
WEDOS_WAPI_PASSWORD='WEDOS_WAPI_PASSWORD'
WEDOS_PROPAGATION_TIMEOUT=3600
WEDOS_POLLING_INTERVAL=30
WEDOS_TTL=300
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
WEDOS_USERNAME L'identifiant VEDOS du compte qui gère la zone DNS.
WEDOS_WAPI_PASSWORD Le mot de passe WAPI généré dans l'administration VEDOS.
WEDOS_PROPAGATION_TIMEOUT Le temps d'attente maximal pour la propagation DNS en secondes.
WEDOS_POLLING_INTERVAL L'intervalle entre les vérifications de propagation DNS.
WEDOS_TTL Le TTL des enregistrements TXT créés pour le défi ACME.
chmod 600 /etc/lego/vedos-$DOMAIN.env

Fichier de configuration lego.yml

Le fichier .yml est un fichier de configuration texte au format YAML, utilisé pour une notation claire des paramètres, des options et des données structurées. Avant d'enregistrer la configuration YAML, remplacez example.com par votre propre domaine, *.example.com par le nom wildcard, vas@email.cz par votre e-mail de contact et les valeurs KID / HMAC par les détails de votre commande de certificat ACME. Des noms tels que certum-example ou example-com-wildcard sont des étiquettes internes ; vous pouvez les laisser, mais avec plusieurs domaines il est conseillé de les renommer selon le domaine.

mkdir /etc/lego/$DOMAIN
nano /etc/lego/$DOMAIN/lego.yml
storage: /etc/lego/example.com

accounts:
  certum-example:
    server: certum
    email: vas@email.cz
    acceptsTermsOfService: true
    eab:
      kid: KID
      hmacKey: HMAC

servers:
  certum:
    url: https://acme.certum.pl/directory

challenges:
  vedos-dns:
    dns:
      provider: vedos
      envFile: /etc/lego/vedos-example-com.env
      resolvers:
        - 1.1.1.1:53

certificates:
  example-com-wildcard:
    account: certum-example
    challenge: vedos-dns
    domains:
      - example.com
      - "*.example.com"
    renew:
      days: 30

hooks:
  deploy:
    command: systemctl reload apache2
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
storage Répertoire pour le compte Lego, les certificats et les métadonnées.
accounts Définition du compte ACME y compris l'e-mail et les détails EAB.
servers.certum.url Le point de terminaison ACME de Certum.
challenges.vedos-dns Validation DNS-01 via le fournisseur VEDOS.
envFile Le fichier contenant les identifiants de connexion de l'API VEDOS.
certificates Liste des certificats que Lego doit gérer.
domains Le domaine apex et le domaine wildcard dans le certificat.
renew.days Combien de jours avant l'expiration Lego doit renouveler.
hooks.deploy.command Commande après une émission ou un renouvellement réussi, ici le rechargement d'Apache.
chmod 600 /etc/lego/$DOMAIN/lego.yml

Le fichier lego.yml contient le HMAC EAB, il doit donc avoir des permissions restreintes. Dans la documentation client, utilisez uniquement des valeurs génériques.

Émission du certificat

Avant l'exécution, remplacez example.com dans le chemin par le domaine que vous avez utilisé lors de la création du répertoire. La première exécution crée le compte ACME, définit les enregistrements DNS TXT via l'API DNS, effectue la validation DNS-01 et enregistre le certificat.

lego --config /etc/lego/$DOMAIN/lego.yml

Pendant l'attente, Lego peut afficher :

dns01: waiting for record propagation timeout=1h0m0s interval=30s
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
lego --config Exécute Lego selon le fichier de configuration. À la première exécution il émet le certificat, aux exécutions suivantes il gère le renouvellement.
dns01: waiting for record propagation Lego a créé l'enregistrement TXT et attend qu'il soit visible dans le DNS.
timeout=1h0m0s Attend au maximum une heure.
interval=30s Vérifie le DNS toutes les 30 secondes.

Cela signifie que Lego vérifie le DNS toutes les 30 secondes et attend au maximum 1 heure. Après le succès, vérifiez les fichiers :

ls -la /etc/lego/$DOMAIN/certificates/

Le répertoire certificates/ contient les .crt, .key émis, les certificats intermédiaires de l'autorité de certification et les métadonnées.

Procédure CLI alternative pour Lego v5

›› Afficher/Masquer la section

Si vous n'utilisez pas de fichier de configuration, dans Lego v5 l'EAB est saisi lors de l'enregistrement du compte. Avant l'exécution, remplacez example.com par votre propre domaine, vas@email.cz par votre propre e-mail et KID / HMAC par les valeurs de votre commande.

lego accounts register \
  --path /etc/lego/example.com \
  --server https://acme.certum.pl/directory \
  --email vas@email.cz \
  --accept-tos \
  --eab \
  --eab.kid 'KID' \
  --eab.hmac 'HMAC'
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
lego accounts register Enregistre le compte ACME manuellement via la CLI sans lego.yml.
--path Répertoire pour le compte et les certificats.
--server Point de terminaison ACME de Certum.
--email E-mail de contact.
--accept-tos Accord avec les conditions d'utilisation.
--eab Active l'External Account Binding.
--eab.kid / --eab.hmac Détails EAB de CertManager.

Listing des comptes. Dans le chemin, réutilisez le même domaine que dans la commande précédente :

lego accounts list --path /etc/lego/example.com

Émission du certificat maintenant sans paramètres EAB. Remplacez example.com par votre propre domaine et *.example.com par le nom wildcard.

set -a
. /etc/lego/vedos-example.com.env
set +a

lego run \
  --path /etc/lego/example.com \
  --server https://acme.certum.pl/directory \
  --email vas@email.cz \
  --dns vedos \
  --dns.resolvers 1.1.1.1:53 \
  --domains example.com \
  --domains '*.example.com'
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
set -a Exporte automatiquement les variables chargées depuis le fichier.
. /etc/lego/vedos-example.com.env Charge les variables de l'API VEDOS dans le shell courant.
set +a Désactive l'export automatique des variables.
lego run Émet ou renouvelle le certificat sans fichier de configuration.
--dns vedos Utilise l'API DNS.
--domains Les domaines qui figureront dans le certificat.

Déploiement du certificat vers Apache

Avant de créer le vhost HTTPS, remplacez example.com par votre propre domaine dans le nom du fichier, les valeurs ServerName et ServerAlias, les chemins du webroot et les chemins du certificat. Ces chemins doivent correspondre au domaine utilisé dans la configuration de Lego.


cat > /etc/apache2/sites-available/example.com-le-ssl.conf <<'EOF'
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName example.com
    ServerAlias *.example.com

    DocumentRoot /var/www/example.com/public
    <Directory /var/www/example.com/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    SSLEngine on
    SSLCertificateFile /etc/lego/example.com/certificates/example.com.crt
    SSLCertificateKeyFile /etc/lego/example.com/certificates/example.com.key

    ErrorLog ${APACHE_LOG_DIR}/example.com_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_ssl_access.log combined
</VirtualHost>
</IfModule>
EOF

a2ensite example.com-le-ssl.conf
apache2ctl configtest
systemctl reload apache2

curl -I https://example.com
curl -I https://test.example.com
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
cat > ...-le-ssl.conf Crée le vhost HTTPS Apache.
ServerName / ServerAlias Spécifie le domaine apex et les sous-domaines wildcard.
SSLCertificateFile Chemin vers le certificat de Lego.
SSLCertificateKeyFile Chemin vers la clé privée de Lego.
a2ensite Active le vhost HTTPS.
systemctl reload apache2 Recharge la nouvelle configuration Apache.
curl -I https://... Vérifie la réponse HTTPS.

Renouvellement automatique

Lego peut renouveler le certificat, mais après l'installation il ne crée pas de timer systemd de lui-même. L'exécution régulière est configurée via un service et un timer personnalisés. Avant l'insertion, remplacez example-com dans le nom du service/timer par votre propre nom sûr sans points, par exemple mojedomena-cz, et remplacez example.com dans le chemin de configuration par votre propre domaine.


cat > /etc/systemd/system/lego-example-com-renew.service <<'EOF'
[Unit]
Description=Renew Certum WildCard SSL for example.com using Lego and VEDOS DNS
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/lego --config /etc/lego/example.com/lego.yml
EOF

cat > /etc/systemd/system/lego-example-com-renew.timer <<'EOF'
[Unit]
Description=Daily Lego renewal check for example.com

[Timer]
OnCalendar=*-*-* 03:20:00
RandomizedDelaySec=1800
Persistent=true

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable --now lego-example-com-renew.timer
systemctl list-timers | grep lego
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
lego-example-com-renew.service Service systemd pour une exécution unique de Lego renew/run.
Type=oneshot Le service démarre, effectue son travail et se termine.
ExecStart Exécute Lego selon lego.yml.
lego-example-com-renew.timer Timer systemd qui exécute le service régulièrement.
OnCalendar Heure de la vérification quotidienne.
RandomizedDelaySec Délai aléatoire afin que les requêtes ne démarrent pas toutes exactement au même moment.
Persistent=true Exécute une exécution manquée après le démarrage du serveur.
systemctl enable --now Active le timer et l'active immédiatement.

Test sûr du service :

systemctl start lego-example-com-renew.service
journalctl -u lego-example-com-renew.service -n 100 --no-pager
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
systemctl start ...service Exécute manuellement le service de renouvellement pour un test.
journalctl -u ... Affiche les derniers logs du service.

Si le certificat n'est pas proche de l'expiration, Lego peut signaler que le renouvellement n'est pas nécessaire. C'est un comportement correct.

Erreurs courantes

Paramètre inconnu dans Lego

Dans Lego v5, les paramètres EAB sont --eab.kid et --eab.hmac. Les paramètres appartiennent toujours à une sous-commande spécifique.

lego accounts register --help
lego accounts list --help
lego run --help

Le nettoyage des enregistrements TXT échoue sur une IP non autorisée

Cleaning up failed ... Access not allowed from this IP address (2a02:...)

Ajoutez également l'adresse IPv6 du serveur aux adresses IP autorisées dans VEDOS WAPI. Le certificat peut être émis correctement, mais les enregistrements TXT resteront dans le DNS après la validation.

Liste de vérification

dig TXT _acme-challenge.example.com +short
lego --config /etc/lego/example.com/lego.yml
systemctl status lego-example-com-renew.timer
apache2ctl configtest
curl -I https://example.com
Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
dig TXT Vérifie les enregistrements TXT dans le DNS.
lego --config Exécute la configuration Lego.
systemctl status Affiche l'état du timer.
apache2ctl configtest Vérifie la configuration Apache.
curl -I Vérifie la réponse HTTPS.

Retour à l'aide
Vous avez trouvé une erreur ou vous ne comprenez pas quelque chose ? Écrivez-nous !

CA Sectigo
CA RapidSSL
CA Thawte
CA GeoTrust
CA DigiCert
CA Certum