LetsEncrypt
Aller à la navigation
Aller à la recherche
Mise en place de certificats httpS Let's Encrypt sur un environnent multi-domaines, avec validation DNS (pour faciliter l'interaction avec Apache + pas d'interruption de service + possibilité de wildcard) et renouvellement automatique.
Note : il y a une deuxième instance sur le serveur d'actux qui gère lists.breizh-entropy.org spécifiquement (et à part des certificats d'Actux).
# Dépendances apt install dnsutils # nsupdate # Utilisateur dédié apt install ssl-cert useradd acme -g ssl-cert -m -s /bin/bash -r su - acme git clone https://github.com/acmesh-official/acme.sh acme.sh-init cd acme.sh-init/ ./acme.sh --install --nocron acme.sh --set-default-ca --server letsencrypt # Stockage mkdir -m 710 /etc/acme chown acme:ssl-cert /etc/acme/ # Lien avec bind # https://github.com/acmesh-official/acme.sh/wiki/dnsapi#7-use-nsupdate-to-automatically-issue-cert touch /etc/bind/acme.key chown acme:bind /etc/bind/acme.key chmod 640 /etc/bind/acme.key tsig-keygen -a hmac-sha512 acme > /etc/bind/acme.key # Conf bind (named.conf.local) include "/etc/bind/acme.key"; zone "breizh-entropy.org" { type master; file "/etc/bind/master/breizh-entropy.org.db"; //allow-update { key "acme"; }; // ou bien plus finement: update-policy { grant acme name _acme-challenge.actux.eu.org TXT; }; ... }; # Ou bien, utiliser une sous-zone dédiée pour éviter que bind ré-écrive la zone principale (tri, suppression des commentaires): zone "_acme-challenge.breizh-entropy.org" { type master; file "/etc/bind/master/_acme-challenge.breizh-entropy.org.db"; update-policy { grant acme name _acme-challenge.breizh-entropy.org TXT; }; }; # et dans la zone principale breizh-entropy.org.db: ; delegation dans un autre fichier (dynamique) à part pour ACME _acme-challenge NS ns0.breizh-entropy.org. # Attention: prévoir un Negative TTL bas (60s) dans la zone car des # entrées TXT _acme-challenge.xxx sont créées/supprimées rapidement chown bind: /etc/bind/master/breizh-entropy.org.db chmod g+w /etc/bind/master/ /etc/bind/master/breizh-entropy.org.db # AppArmor si besoin echo '/etc/bind/master/** rw,' > /etc/apparmor.d/local/usr.sbin.named # Lien avec apache cat <<EOF > /etc/sudoers.d/acme acme ALL = NOPASSWD: /usr/sbin/service apache2 force-reload EOF a2enmod ssl # Conf apache SSLEngine on SSLCertificateFile /etc/acme/multi-domain.cer SSLCertificateKeyFile /etc/acme/multi-domain.key SSLCertificateChainFile /etc/acme/fullchain.cer # Installation initiale # Reset rm -rf ~/.acme.sh/ ./acme.sh --install --nocron exec bash NSUPDATE_SERVER="localhost" NSUPDATE_KEY="/etc/bind/acme.key" \ acme.sh \ --server letsencrypt_test \ --issue --dns dns_nsupdate -d breizh-entropy.org -d '*.breizh-entropy.org' -d jardin-entropique.eu.org -d www.jardin-entropique.eu.org -d elaboratoire.eu.org acme.sh --install-cert -d breizh-entropy.org \ --cert-file /etc/acme/multi-domain.cer --key-file /etc/acme/multi-domain.key --fullchain-file /etc/acme/fullchain.cer \ --reloadcmd "sudo service apache2 force-reload" # Note: paramètres sauvés dans ~/.acme.sh/breizh-entropy.org/breizh-entropy.org.conf # (y compris Le_ReloadCmd en base64) # --dnssleep 60 peut être nécessaire pour éviter le DoH # (par défaut, ACME.sh utilise https://fr.wikipedia.org/wiki/DNS_over_HTTPS , # ce qui requiert d'activer des flux vers un DoH type cloudflare/google/aliyun, # cf. https://github.com/acmesh-official/acme.sh/wiki/dnscheck ) # Puis sans '_test'. # Test cron ~/.acme.sh/acme.sh --cron --staging # Note: '--staging' a l'air plus ou moins cassé (2024-03), il prend le serveur de release # Cron (renouvellement tous les mois par défaut) cat <<EOF > /etc/cron.d/acme MAILTO=root 36 0 * * * acme /home/acme/.acme.sh/acme.sh --cron --log > /dev/null EOF # Active une notification en cas de renouvellement ou d'erreur MAIL_TO=root@breizh-entropy.org acme.sh --set-notify --notify-hook mail # Debug nsupdate $ nsupdate -k /etc/bind/acme.key <<'EOF' server ns0.breizh-entropy.org 53 update add test.breizh-entropy.org. 60 IN TXT Test send EOF # Maintenance https://github.com/acmesh-official/acme.sh/#14-how-to-upgrade-acmesh
Problèmes connus
S'il y a plusieurs serveurs DNS secondaires, qui ne se mettent pas à jour à la même vitesse, il est possible que le premier test de réplication (via DoH, cf. ci-dessus) réussisse sur un serveur DNS secondaire à jour, mais que le challenge acme échoue sur un autre serveur lui en retard.
Solutions:
- Comme acme.sh s'y prend un mois à l'avance, il y a des chances que ça finisse quand même par passer un jour ou l'autre;
- Passer en --dnssleep pour éviter le DoH et alonger le délai d'attente de réplication;
- Passer par une sous-zone dédiée (cf. ci-dessus) avec un seul et unique NS.
Créé initialement pendant Ateliers2020/LetsEncryptDNS