- Modifié
Pour mondedie.fr, j'ai organisé le renouvellement de la manière suivante (à noter que dans notre cas, le serveur web et le serveur mail ne sont pas hébergés sur la même machine, donc j'ai du utiliser rsync et ssh) :
acme.sh \
--issue \
-w /mnt/docker/nginx/www/acme \
-k 4096 \
-d mondedie.fr \
-d www.mondedie.fr \
...
acme.sh \
--install-cert -d mondedie.fr \
--cert-file /mnt/docker/nginx/ssl/live/mondedie.fr/cert.pem \
--key-file /mnt/docker/nginx/ssl/live/mondedie.fr/privkey.pem \
--ca-file /mnt/docker/nginx/ssl/live/mondedie.fr/chain.pem \
--fullchain-file /mnt/docker/nginx/ssl/live/mondedie.fr/fullchain.pem \
--reloadcmd "docker-compose -f /docker/docker-compose.yml restart nginx && /usr/local/bin/update-mail-tlsa"
#!/bin/bash
# /usr/local/bin/update-mail-tlsa sur mondedie-web
DOMAIN="mondedie.fr"
LETS_ENCRYPT_LIVE_PATH="/mnt/docker/nginx/ssl/live/${DOMAIN}"
SLACK_HOOK=https://hooks.slack.com/services/xxxxxxxx/xxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxx
# Empreinte du certificat récupérée lors du renouvellement
# par acme.sh à partir de mondedie-web
fingerprint=$(openssl x509 -noout -in "${LETS_ENCRYPT_LIVE_PATH}/cert.pem" -fingerprint -sha256 | cut -c 20- | sed s/://g)
# Mise à jour des certificats du serveur mail
# Seul l'@IP de mondedie-web est autorisée à se connecter avec une clé SSH via l'utilisateur root sur mondedie-mail
rsync -Lvr "${LETS_ENCRYPT_LIVE_PATH}/" root@mondedie-mail.lan:"/mnt/docker/ssl/letsencrypt/live/mail.${DOMAIN}"
# Redémarrage du serveur mail suite au renouvellement des certificats
ssh root@mondedie-mail.lan docker-compose -f /docker/docker-compose.yml restart mailserver
# Mise à jour de l'enregistrement TLSA
ssh root@mondedie-mail.lan update-tlsa ${fingerprint,,}
curl --silent -X POST --data-urlencode 'payload={"channel":"#mondedie-flarum", "username":"acme-bot","text":"Le certificat SSL a été renouvelé sur mondedie-web et mondedie-mail. Les conteneurs nginx et mailserver ont été redémarrés automatiquement.","icon_emoji":":infomation_source:"}' $SLACK_HOOK >/dev/null 2>&1
#!/bin/bash
# /usr/local/bin/update-tlsa sur mondedie-mail
SLACK_HOOK=https://hooks.slack.com/services/xxxxxxxx/xxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxx
# Empreinte du certificat récupérée lors du renouvellement
# par acme.sh à partir de mondedie-web
fingerprint=$1
domain="mondedie.fr"
zonename="db.${domain}"
zonefile="/mnt/docker/nsd/zones/${zonename}"
serial=$(date -d "+1 day" +'%Y%m%d%H')
tlsa_line_number=$(grep -n TLSA $zonefile | cut -d : -f 1)
tlsa_dns_record="_dane IN TLSA 3 0 1 ${fingerprint}"
expiration_date=$(date -d "+6 months" +'%Y%m%d%H%M%S')
# Mise à jour de la zone DNS avec un nouveau
# serial et un nouvel enregistrement TLSA
sed -i -e "s/20[0-9][0-9]\{7\} ; Serial/${serial} ; Serial/g" \
-e "${tlsa_line_number}s/.*/${tlsa_dns_record}/" $zonefile
# On vérifie que la zone est valide avant de la signer
if docker exec nsd nsd-checkzone "$domain" /zones/"$zonename" | grep -q 'zone mondedie.fr is ok'; then
echo "Execution de la commande : docker exec nsd signzone ${domain} ${expiration_date}"
docker exec nsd signzone "$domain" "$expiration_date"
curl --silent -X POST --data-urlencode 'payload={"channel":"#mondedie-flarum", "username":"acme-bot","text":"La zone DNS a été mise à jour et signée avec DNSSEC. Merci de vérifier la conformité 10 minutes après la notification avec : http://dnsviz.net/d/mondedie.fr/analyze/ et https://dnssec-debugger.verisignlabs.com/mondedie.fr","icon_emoji":":infomation_source:"}' $SLACK_HOOK >/dev/null 2>&1
curl --silent -X POST --data-urlencode 'payload={"channel":"#mondedie-flarum", "username":"acme-bot","text":"'"zonefile=$zonefile, expiration_date=$expiration_date, serial=$serial, tlsa_dns_record=$tlsa_dns_record, tlsa_line_number=$tlsa_line_number"'","icon_emoji":":infomation_source:"}' $SLACK_HOOK >/dev/null 2>&1
else
echo "La zone ${zonefile} n'est pas valide !"
curl --silent -X POST --data-urlencode 'payload={"channel":"#mondedie-flarum", "username":"acme-bot","text":"Une erreur est survenue pendant la mise à jour de la zone DNS. Merci de vérifier la conformité avec la commande suivante : docker exec nsd nsd-checkzone '"$domain"' /zones/'"$zonename"'","icon_emoji":":rotating_light:"}' $SLACK_HOOK >/dev/null 2>&1
fi
Et ne pas oublier de mettre ceci dans chaque vhost nginx ayant un sous-domaine renouvelé automatiquement :
location ~ /\.well-known/acme-challenge {
root /nginx/www/acme; # à modifier selon votre configuration
allow all;
}
Je l'avais pas posté avant sur le forum parce que je l'avais pas suffisamment testé, j'étais sûr de moi à 95% Mais aujourd'hui le renouvellement a eu lieu et il n'y a eu aucun problème.