LetsEncrypt

De Breizh-Entropy
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