SSLmentor

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

Lego

Lego

Client ACME Lego

Le client ACME Lego est un projet indépendant, gratuit et open-source écrit dans le langage Go. Il est idéal pour l'intégration personnalisée et les scripts et bénéficie d'un large support de la part des registraires de domaines et des fournisseurs DNS. Lego est un client ACME flexible qui peut être facilement intégré à des systèmes et des scripts personnalisés. Outre la validation HTTP-01, il propose la validation DNS via de nombreux fournisseurs DNS (liste des fournisseurs DNS pris en charge) pour obtenir des certificats SSL WildCard.
Le guide utilise une syntaxe vérifiée sur la version Lego 5.*.* et est destiné à Debian/Ubuntu avec Apache 2 et le client ACME Lego.

Concepts de base

  • ACME – protocole pour l'émission et le renouvellement automatisés des certificats SSL/TLS.
  • HTTP-01 – méthode de validation ACME qui vérifie la propriété du domaine à l'aide d'un fichier temporaire accessible via HTTP.
  • DNS-01 – méthode de validation via l'enregistrement DNS TXT _acme-challenge.
  • EAB kid + hmac – détails External Account Binding (EAB) fournis par l'autorité de certification. Ils relient ACME client à un compte ou à un produit.
  • 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.

Si le domaine example.com apparaît dans les exemples, remplacez-le toujours 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.

Apache, webroot

Cette procédure crée une configuration VirtualHost de base pour le domaine sur le port 80. Elle définit DocumentRoot, les permissions du répertoire web, crée les logs Apache, active la configuration à l'aide de a2ensite, en vérifie l'exactitude (apache2ctl configtest) et recharge les modifications. Enfin, elle vérifie la disponibilité du site web à l'aide d'une requête HTTP curl.

›› Afficher/Masquer la section

Avant l'exécution, remplacez la valeur example.com dans la ligne DOMAIN="example.com" par votre propre domaine. 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

# or just updates
apt update
apt install --only-upgrade apache2
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 le sous-domaine :


cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
    ServerName $DOMAIN
    ServerAlias www.$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"
curl -I "http://www.$DOMAIN"

Résultat : après avoir ouvert http://example.com, la page de test devrait s'afficher.

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 www.$DOMAIN Crée la prise en charge du 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 et les hooks.

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, vas@email.cz par votre e-mail de contact et les valeurs KID / HMAC par les détails de votre commande de certificat ACME.

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

accounts:
  certum-account:
    server: certum
    email: your@email.com   # your email address for CA Certum
    acceptsTermsOfService: true
    eab:
      kid: KID
      hmacKey: HMAC

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

challenges:
  http-chal:
    http:
      # Path to your website's document root.
      # Lego will temporarily write a file to this directory .well-known/acme-challenge/
      webroot: /var/www/example.com/public

certificates:
  example-com:
    account: certum-account
    challenge: http-chal
    domains:
      - example.com
      - www.example.com
    renew:
      days: 30

hooks:
  deploy:
    command: systemctl reload apache2

Astuce ! Vous pouvez générer un contenu YML presque complet directement sur le serveur, puis il suffit de compléter le bon e-mail, kid et hmacKey. Exécutez simplement la commande ci-dessous et copiez le contenu de la page index.html dans le fichier lego.yml.
›› Afficher/Masquer le YML préparé.

cat > "/var/www/$DOMAIN/public/index.html" <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>${DOMAIN}</title>
<style>
body { font-family: sans-serif; max-width: 900px; margin: 40px auto; }
pre { background:#f4f4f4; padding:1em; overflow:auto; }
</style>
</head>
<body>

<h1>OK – ${DOMAIN}</h1>
<p>Apache is working correctly.</p>
<h2>lego.yml</h2>
<pre><code>storage: /etc/lego/${DOMAIN}

accounts:
  certum-account:
    server: certum
    email: YOUR_EMAIL
    acceptsTermsOfService: true
    eab:
      kid: YOUR_KID
      hmacKey: YOUR_HMAC_KEY

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

challenges:
  http-chal:
    http:
      webroot: /var/www/${DOMAIN}/public

certificates:
  ${DOMAIN//./-}:
    account: certum-account
    challenge: http-chal
    domains:
      - ${DOMAIN}
      - www.${DOMAIN}
    renew:
      days: 30

hooks:
  deploy:
    command: systemctl reload apache2
</code></pre>

</body>
</html>
EOF

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

chmod 600 /etc/lego/$DOMAIN/lego.yml

Vérification des permissions et du propriétaire du fichier :

stat -c "%a %U:%G %n" /etc/lego/$DOMAIN/lego.yml
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.http-chal Validation via http.
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.

Émission du certificat SSL/TLS

Avant l'exécution, vérifiez echo ${DOMAIN} ou définissez la variable DOMAIN sur le nom de votre domaine DOMAIN="example.com". L'outil Lego effectue la validation HTTP-01 à l'aide d'un fichier temporairement stocké dans le webroot, vérifie la propriété du domaine puis crée un certificat SSL/TLS. Le certificat, la clé privée et le certificat de l'émetteur (intermédiaire) seront stockés dans le répertoire /etc/lego/${DOMAIN}/certificates/.

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

Pendant la génération, le client ACME Lego affichera des informations sur la requête :

root@vmiXXXXXXXX:~# echo ${DOMAIN}
example.com

root@:~# lego --config /etc/lego/$DOMAIN/lego.yml

INFO  Archive account scope=accountID filepath=/etc/lego/example.com/accounts/acme.certum.pl/certum-acme/
      archives=/etc/lego/example.com/archives/accounts/acme.certum.pl_certum-acme_1785270773.zip
INFO  Private key saved. filepath=/etc/lego/example.com/accounts/acme.certum.pl/certum-account/certum-account.key
INFO  Registering the account (EAB). email=your@email.com
WARN  !!!! HEADS UP !!!!

Your account credentials have been saved in your
configuration directory at "/etc/lego/example.com/accounts".

You should make a secure backup of this folder now. This
configuration directory will also contain private keys
generated by lego and certificates obtained from the ACME
server. Making regular backups of this folder is ideal.

INFO  Obtaining bundled SAN certificate. domains="example.com, www.example.com"
INFO  Use solver. domain=www.example.com type=http-01
INFO  Use solver. domain=example.com type=http-01
INFO  http01: Trying to solve HTTP-01. domain=www.example.com
INFO  The server validated our request. domain=www.example.com
INFO  http01: Trying to solve HTTP-01. domain=example.com
INFO  The server validated our request. domain=example.com
INFO  Validations succeeded; requesting certificates. domains="example.com, www.example.com"
INFO  Waiting for certificates. timeout=30s interval=500ms domains="example.com, www.example.com"
INFO  Server responded with a certificate. domains="example.com, www.example.com"
INFO  Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.crt
INFO  Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.issuer.crt
INFO  Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.key
INFO  Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.pem
INFO  Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.json

Vérifier les fichiers du certificat SSL généré

Affiche le contenu du répertoire certificates créé par le service Lego, y compris le certificat, la clé privée et le certificat de l'émetteur pour le domaine sélectionné.

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.

Déploiement du certificat vers Apache

Cet exemple utilise la variable ${DOMAIN}, que vous devriez déjà avoir définie depuis le début du guide. Avant d'exécuter les commandes, vous pouvez vous assurer que la variable est correctement définie, par exemple : echo ${DOMAIN}
La variable ${DOMAIN} est utilisée dans le nom du fichier de configuration, les valeurs ServerName et ServerAlias ainsi que le chemin vers le webroot.
Attention ! - les chemins vers le certificat SSL et la clé privée utilisent le domaine sous la forme example-com. Les chemins doivent correspondre au domaine utilisé dans la configuration de Lego.


cat > /etc/apache2/sites-available/${DOMAIN}-le-ssl.conf <<EOF
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName ${DOMAIN}
    ServerAlias www.${DOMAIN}

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

    SSLEngine on
    SSLCertificateFile /etc/lego/${DOMAIN}/certificates/${DOMAIN//./-}.crt
    SSLCertificateKeyFile /etc/lego/${DOMAIN}/certificates/${DOMAIN//./-}.key

    ErrorLog ${APACHE_LOG_DIR}/${DOMAIN}_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/${DOMAIN}_ssl_access.log combined
</VirtualHost>
</IfModule>
EOF
a2ensite ${DOMAIN}-le-ssl.conf
apache2ctl configtest
systemctl reload apache2

curl -I https://${DOMAIN}
curl -I https://www.${DOMAIN}

Résultat : HTTPS fonctionnel.

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 le sous-domaine.
SSLCertificateFile Chemin vers le certificat.
SSLCertificateKeyFile Chemin vers la clé privée.
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 automatiquement, mais après l'installation il ne crée pas de lui-même les unités systemd pour une exécution régulière. Deux unités doivent donc être créées pour le renouvellement automatique :

  • lego-example-com-renew.service – exécute la vérification et, si nécessaire, le renouvellement du certificat.
  • lego-example-com-renew.timer – garantit que le service s'exécute quotidiennement à une heure définie.

Avant l'insertion, remplacez example-com dans le nom du service/timer par votre propre nom si nécessaire, et remplacez example.com dans le chemin de configuration par votre propre domaine.


cat > /etc/systemd/system/lego-${DOMAIN//./-}-renew.service <<EOF
[Unit]
Description=Renew ACME Certum SSL for example.com using Lego HTTP-01
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/lego --config /etc/lego/${DOMAIN}/lego.yml
EOF

cat > /etc/systemd/system/lego-${DOMAIN//./-}-renew.timer <<EOF
[Unit]
Description=Daily Lego renewal check for ${DOMAIN}

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

[Install]
WantedBy=timers.target
EOF

Après avoir créé les unités, vérifiez leur contenu :

cat /etc/systemd/system/lego-example-com-renew.service
echo "----------------"
cat /etc/systemd/system/lego-example-com-renew.timer

Rechargez les nouvelles unités, activez le timer et vérifiez qu'il fonctionne :

systemctl daemon-reload
systemctl enable --now lego-${DOMAIN//./-}-renew.timer
systemctl list-timers | grep lego

Résultat : le timer est actif et systemd a planifié sa prochaine exécution.

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-${DOMAIN//./-}-renew.service
systemctl status lego-${DOMAIN//./-}-renew.service --no-pager
journalctl -u lego-${DOMAIN//./-}-renew.service -n 100 --no-pager

Résultat : 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.

Commande / valeur Ce qu'elle fait / ce qu'il faut remplacer
systemctl start ...service Exécute manuellement le service de renouvellement pour un test.
systemctl status ... Montre si le service s'est terminé avec succès
journalctl -u ... Affiche les derniers logs du service.

Liste des unités Lego disponibles :

ls -l /etc/systemd/system/lego*

systemctl list-timers | grep lego

Résultat : les deux variantes affichent tous les services et timers liés au client ACME Lego.

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