ZW3B :-: API Client * Contents * Docs by LAB3W.ORJ

Translate this page

Name : BETA-TESTERS

Project name : ZW3B-API-BETA-TESTERS

Authorized. - 200 - Client API Name and Origin Wildcard OK

¿Comment? 'Ou' ¿Que faire?, OS GNU/Linux, Sécurité, Certificats SSL/TLS Let's Encrypt DNS authoritaire / nsupdate

Utilisez nsupdate avec son serveur DNS pour créer et mettre à jours des certificats SSL/TLS Let's Encrypt

Author : O.Romain.Jaillet-ramey

NdM : 2023/07/09 - Mise à jour (ajout d'information et 2 scripts en fin d'article).
NdM : 2023/08/08 - Modification du script pour vérfier la validité de nos certificats SSL et exemple de mise à jour des champs d'enregistrement TLSA (DANE).
NdM : 2023/09/20 : Modification des scripts "acme-certif-date_verification.bash" et "acme-certif-frontend.bash"
NdM : 2023/12/14 : Modification du script "acme-certif-date_verification.bash" pour qu'il "nsupdate" les nouvelles valeurs TLSA du protocole HTTPS sur un serveur DNS.
NdM : 2023/12/22 : Modification du script "acme-certif-date_verification.bash" pour qu'il "nsupdate" les nouvelles valeurs TLSA du protocole SMTPS sur un serveur DNS.
NdM : 2024/05/09 : Modification du script "acme-certif-date_verification.bash" pour qu'il "SCP" et UPDATE/DEPLOY le nouveau certificats Let's Encrypt dans Zimbra mail serveur.

Je vais vous expliquer comment créer des certificats SSL/TLS Let's Encrypt en utilisant votre serveur DNS pour créer/valider et mettre à jour vos certificats internationalement.

Let's Encrypt est une autorité de certification qui fournit des certificats gratuits X.509 pour le protocole cryptographique TLS au moyen d'un processus automatisé.

Pré-requis : un serveur DNS authoritaire que vous administrez ; où nous allons activer le moyen de faire des mise à jour dynamique (si cela n'est pas déjà fait).


  1. Je vais utiliser la commande nsupdate pour mettre à jour dynamiquement mon server DNS, lors de la création et des mises à jours des certificats.

    nsupdate permet de mettre à jour des "zones" DNS sur votre serveur autoritaire.

  2. Je vais utiliser l'utilitaire acme.sh pour communiquer avec Let's Encrypt.

    acme.sh permet de créer des certificats SSL/TLS, et permet de mettre à jour vos certificats sur l'AC (l'Authorité de Certifications) Let's Encrypt pour que vos certifats SSL/TLS restent valident dans le monde entier.

Installer acme.sh un des utilitaires de Let's Encrypt

Je choisis d'installer acme.sh sur mon container "web" (je vous dis pourquoi, bientôt).

Pour l'installation c'est simple :

Script avec 10 lignes

001root@web:~ # git clone https://github.com/acmesh-official/acme.sh.git
002cd acme.sh
003./acme.sh --install \ 
004--home ~/acme \  
005--config-home ~/acme/data \
006--cert-home  ~/acme/mycerts \ 
007--accountemail  "admin@mydomain.tld" \ 
008--accountkey  ~/acme/myaccount.key \ 
009--accountconf ~/acme/myaccount.conf \ 
010--useragent  "Mozilla/5.0 (compatible; Linux 4.19.0-8-amd64; x86_64) MYACME.Bot/YOUR-CREW (20221002)."
Retirer les numéros de lignes

Les options de configuration d'installation sous les suivantes :

Qui me crée dans mon répertoire /root le répertoire acme/

Script avec 12 lignes

001root@web:~ # ls -la acme/
002total 260
003drwx------  6 root root   4096 juin  10 00:20 .
004drwx------ 15 root root  12288 juin  26 16:05 ..
005-rwxr-xr-x  1 root root 220762 juin  10 00:20 acme.sh
006-rw-r--r--  1 root root    142 nov.  27  2022 acme.sh.env
007drwx------ 26 root root   4096 juin  17 15:46 data
008drwxr-xr-x  2 root root   4096 juin  10 00:20 deploy
009drwxr-xr-x  2 root root   4096 juin  10 00:20 dnsapi
010-rw-r--r--  1 root root    591 juin  26 00:51 myaccount.conf
011-rw-------  1 root root   1675 nov.  27  2022 myaccount.key
012drwxr-xr-x  2 root root   4096 juin  10 00:20 notify
Retirer les numéros de lignes

Ci-dessous le contenu du fichier /root/acme/myaccount.conf

Script avec 16 lignes

001LOG_FILE="/root/acme/data/acme.sh.log"
002LOG_LEVEL=1
003
004AUTO_UPGRADE='1'
005
006#NO_TIMESTAMP=1
007
008ACCOUNT_KEY_PATH='/root/acme/myaccount.key'
009ACCOUNT_EMAIL='admin+acme@mydomain.tld'
010UPGRADE_HASH='b7caf7a0165yuaeiyaeuicfksmlka06bb32025066d'
011USER_AGENT='Mozilla/5.0 (compatible; Linux 4.19.0-8-amd64; x86_64) MYACME.Bot/ZW3B (20221127).'
012SAVED_NSUPDATE_SERVER='dns.ipv10.net'
013SAVED_NSUPDATE_SERVER_PORT=''
014SAVED_NSUPDATE_KEY='/root/nsupdate/Knsupdate-key-zone.+157+09852.private'
015SAVED_NSUPDATE_ZONE=''
016USER_PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/local/openldap/bin'
Retirer les numéros de lignes

Avant de pouvoir créer un certificat, il faut configurer "une" zone de notre serveur DNS pour qu'il accepte les mises à jour dynamique - si vous ne connaissez pas vous allez aimer.

J'ajoute la ligne de la tâche planifiée (que j'ai transformé -- j'ai ajouté "une attente (sleep) avec un nombre (-n1) aléatoire (shuffle) entre 0 et une heure (3600sec)" à minuit heure locale, pour ne pas surcharger les serveurs Let's Encrypt tous les jours à la même seconde).

Script avec 3 lignes

001root@web:~ # crontab -l
002[....]
00300 00 * * * sleep $(shuf -i 0-3600 -n1) ; "/root/acme"/acme.sh --cron --home "/root/acme" --config-home "/root/acme/data" > /dev/null
Retirer les numéros de lignes

Configurer une zone DNS, nous disons "example.com" pour les mises à jour dynamique par nsupdate

Dans le fichier name.conf.local ajouter à une zone l'option allow-update avec la clef tsig :

Par exemple : /etc/bind/named.conf.local

Script avec 12 lignes

001[...]
002    zone "example.com" {
003        type master;
004#        file "/etc/bind/masters/example.com.hosts";
005        file "/etc/bind/masters/example.com.hosts.signed";
006
007        allow-transfer {  key "ns-ldap"; };
008        allow-update { key "nsupdate-key-zone"; };
009
010        notify yes;
011    };
012[...]
Retirer les numéros de lignes

Pour créer la clef tsig de mise à jour dynamique :

Depuis le serveur DNS dans le répertoire correspondant à l'emplacement de clefs key-directory que nous avons configué dans les "options" du fichier /etc/bind/named.conf.options :

Script avec 1 ligne

001root@dns:/etc/bind/keys # tsig-keygen -a hmac-sha512 nsupdate-key-zone
Retirer les numéros de lignes

Il faut passer les clefs à l'utilisateur "bind".

Qui nous créait 2 fichiers :

Script avec 3 lignes

001root@dns:/etc/bind/keys # ls -l Knsupdate-key-zone.+157+09852.*
002-rw-r--r-- 1 bind bind 123 nov.  17  2022 Knsupdate-key-zone.+157+09852.key
003-rw------- 1 bind bind 229 nov.  17  2022 Knsupdate-key-zone.+157+09852.private
Retirer les numéros de lignes

Maintenant il faut envoyer sur le serveur Web la clef pour pouvoir utiliser nsupdate depuis notre serveur Web.

J'oubliais, il faut autoriser le serveur Web à faire des mises à jour. Pour cela, dans un des fichiers de "bind" ajouter :

Par exemple dans /etc/bind/named.conf :

Script avec 7 lignes

001[...]
002# WEB.SERVER (IPv6)
003server 2607:5300:60:9389:15:1:a:10 {
004        transfer-format many-answers;
005        keys { "nsupdate-key-zone"; };
006};
007[...]
Retirer les numéros de lignes

Pour transférer la clef dans le répertoire nsupdate/ de l'utilisateur "root" du serveur "web" vous pouvez utiliser la commande :

Script avec 1 ligne

001root@dns:/etc/bind/keys # scp /etc/bind/keys/Knsupdate-key-zone.+157+09852.private root@web:/root/nsupdate/
Retirer les numéros de lignes

Nous allons pouvoir créer et mettre à jour nos certificats SSL/TLS Let's Encrypt avec acme.sh.

Créons un certificat Let's Encrypt pour notre zone / nom de domaine "example.com"

Depuis le serveur Web, là où nous avons installer acme.sh, créons un certificat.

Script avec 1 ligne

001root@web:~ # acme.sh --install-cert --domain example.com
Retirer les numéros de lignes

Ca va nous créait un répertoire ici :

Script avec 4 lignes

001root@web:~ # ls -l /root/acme/data/example.com
002total 8
003drwxr-xr-x 2 root root 4096 juin  17 15:45 backup
004-rw-r--r-- 1 root root   98 juin  17 15:45 example.com.conf
Retirer les numéros de lignes

Ensuite, vous pouvez envoyer la commande comme çà (nul besoin d'envoyer les variable d'environnement NSUPDATE_SERVER et NSUPDATE_KEY) :

Script avec 80 lignes

001root@web:~ # NSUPDATE_SERVER="dns.ipv10.net" NSUPDATE_KEY="/root/nsupdate/Knsupdate-key-zone.+157+09852.private" acme.sh --issue -k ec-384 -d example.com -d '*.example.com ' --dns dns_nsupdate --server letsencrypt
002[dimanche 27 novembre 2022, 18:41:37 (UTC+0100)] Using CA: https://acme-v02.api.letsencrypt.org/directory
003[dimanche 27 novembre 2022, 18:41:37 (UTC+0100)] Creating domain key
004[dimanche 27 novembre 2022, 18:41:37 (UTC+0100)] The domain key is here: /root/acme/data/example.com_ecc/example.com.key
005[dimanche 27 novembre 2022, 18:41:37 (UTC+0100)] Multi domain='DNS:example.com,DNS:*.example.com'
006[dimanche 27 novembre 2022, 18:41:37 (UTC+0100)] Getting domain auth token for each domain
007[dimanche 27 novembre 2022, 18:41:39 (UTC+0100)] Getting webroot for domain='example.com'
008[dimanche 27 novembre 2022, 18:41:39 (UTC+0100)] Getting webroot for domain='*.example.com'
009[dimanche 27 novembre 2022, 18:41:39 (UTC+0100)] Adding txt value: cFXIej611Rh8iar4hJiJfus85uHSk9FIhEWllDCrrQ4 for domain:  _acme-challenge.example.com
010[dimanche 27 novembre 2022, 18:41:39 (UTC+0100)] adding _acme-challenge.example.com. 60 in txt "cFXIej611Rh8iar4hJiJfus85uHSk9FIhEWllDCrrQ4"
011[dimanche 27 novembre 2022, 18:41:39 (UTC+0100)] The txt record is added: Success.
012[dimanche 27 novembre 2022, 18:41:39 (UTC+0100)] Adding txt value: C8vU4Sgg0UythPJfeudNr9dvEl8D6eULaBHDRgKHESs for domain:  _acme-challenge.example.com
013[dimanche 27 novembre 2022, 18:41:39 (UTC+0100)] adding _acme-challenge.example.com. 60 in txt "C8vU4Sgg0UythPJfeudNr9dvEl8D6eULaBHDRgKHESs"
014[dimanche 27 novembre 2022, 18:41:39 (UTC+0100)] The txt record is added: Success.
015[dimanche 27 novembre 2022, 18:41:39 (UTC+0100)] Let's check each DNS record now. Sleep 20 seconds first.
016[dimanche 27 novembre 2022, 18:42:00 (UTC+0100)] You can use '--dnssleep' to disable public dns checks.
017[dimanche 27 novembre 2022, 18:42:00 (UTC+0100)] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
018[dimanche 27 novembre 2022, 18:42:00 (UTC+0100)] Checking example.com for _acme-challenge.example.com
019[dimanche 27 novembre 2022, 18:42:01 (UTC+0100)] Not valid yet, let's wait 10 seconds and check next one.
020[dimanche 27 novembre 2022, 18:42:12 (UTC+0100)] Checking example.com for _acme-challenge.example.com
021[dimanche 27 novembre 2022, 18:42:12 (UTC+0100)] Domain example.com '_acme-challenge.example.com' success.
022[dimanche 27 novembre 2022, 18:42:12 (UTC+0100)] Let's wait 10 seconds and check again.
023[dimanche 27 novembre 2022, 18:42:24 (UTC+0100)] You can use '--dnssleep' to disable public dns checks.
024[dimanche 27 novembre 2022, 18:42:24 (UTC+0100)] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
025[dimanche 27 novembre 2022, 18:42:24 (UTC+0100)] Checking example.com for _acme-challenge.example.com
026[dimanche 27 novembre 2022, 18:42:24 (UTC+0100)] Domain example.com '_acme-challenge.example.com' success.
027[dimanche 27 novembre 2022, 18:42:24 (UTC+0100)] Checking example.com for _acme-challenge.example.com
028[dimanche 27 novembre 2022, 18:42:24 (UTC+0100)] Already success, continue next one.
029[dimanche 27 novembre 2022, 18:42:24 (UTC+0100)] All success, let's return
030[dimanche 27 novembre 2022, 18:42:24 (UTC+0100)] Verifying: example.com
031[dimanche 27 novembre 2022, 18:42:24 (UTC+0100)] Pending, The CA is processing your order, please just wait. (1/30)
032[dimanche 27 novembre 2022, 18:42:27 (UTC+0100)] Success
033[dimanche 27 novembre 2022, 18:42:27 (UTC+0100)] Verifying: *.example.com
034[dimanche 27 novembre 2022, 18:42:28 (UTC+0100)] Pending, The CA is processing your order, please just wait. (1/30)
035[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] Success
036[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] Removing DNS records.
037[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] Removing txt: cFXIej611Rh8iar4hJiJfus85uHSk9FIhEWllDCrrQ4 for domain: _acme-challenge.example.com
038[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] removing _acme-challenge.example.com. txt
039[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] Removed: Success
040[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] Removing txt: C8vU4Sgg0UythPJfeudNr9dvEl8D6eULaBHDRgKHESs for domain: _acme-challenge.example.com
041[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] removing _acme-challenge.example.com. txt
042[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] Removed: Success
043[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] Verify finished, start to sign.
044[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] Lets finalize the order.
045[dimanche 27 novembre 2022, 18:42:32 (UTC+0100)] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/844254157/148100921877'
046[dimanche 27 novembre 2022, 18:42:33 (UTC+0100)] Downloading cert.
047[dimanche 27 novembre 2022, 18:42:33 (UTC+0100)] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/039018fe4ff377bae8ffa5414587248b87ba'
048[dimanche 27 novembre 2022, 18:42:33 (UTC+0100)] Cert success.
049-----BEGIN CERTIFICATE-----
050MIIEcDCCA1igAwIBAgISA5AY/k/zd7ro/6VBRYcki4e6MA0GCSqGSIb3DQEBCwUA
051MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
052EwJSMzAeFw0yMjExMjcxNjQyMzNaFw0yMzAyMjUxNjQyMzJaMBIxEDAOBgNVBAMT
053B3p3M2IudHYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATyBsggIW81ICHMZRSZC7+z
054eT4vehWp+8/DjzzYVOXTbVXfoYT0OK7FG1bFe6w9K5RHjo6oAXDsaRYILUDpPxwd
055Ds/EDBx4a0FLlLhF5TRak2E4J0yWWcjTTzHSSaJWR+OjggJMMIICSDAOBgNVHQ8B
056Af8EBAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB
057/wQCMAAwHQYDVR0OBBYEFN/cg8rD30RVvd5cFNjYTqnrvdBQMB8GA1UdIwQYMBaA
058FBQusxe3WFbLrlAJQOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcw
059AYYVaHR0cDovL3IzLm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMu
060aS5sZW5jci5vcmcvMB0GA1UdEQQWMBSCCSouenczYi50doIHenczYi50djBMBgNV
061HSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpo
062dHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQMGCisGAQQB1nkCBAIEgfQEgfEA
0637wB2AHoyjFTYty22IOo44FIe6YQWcDIThU070ivBOlejUutSAAABhLou/8IAAAQD
064AEcwRQIgBwly1igZHpDTzGGpd01WNVxrqRYH00LcCvLA7x4IXdgCIQDnkhdkMW+S
065pbrbHQ4Uqv8pBrVXnL2nLgkyImUWGHU76AB1AK33vvp8/xDIi509nB4+GGq0Zyld
066z7EMJMqFhjTr3IKKAAABhLou/9AAAAQDAEYwRAIgEMQsh2lYmTLkKpDDyEQuCnsO
067nA6/vnZVgdJcDE74HkwCIF/rhY/n0ZH6LL4yICj63JZzdJThnIq9zNjj03PlhraL
068MA0GCSqGSIkjldqdjql133qjdqljdlàç212dGGGxZGJXQ+sgKkxYBY5O2lxhvTgp
069V9mOr0HABBYJomGmlJ3o9/BZ6aADnQ40W8B8xnh5PlaDi0rNQ3gBhwLn4tZB+NfK
070KQDLpPIGqRrsdfACnkiu4GoiFkBBJY+HkgatAWdlRrlTlM8AkZNrX1kzg8u3jQY1
071SVVJ8g4qjbYWdCaUe8r/EMILX9bL4LvNtvW4gvQsNWVF2E7GbzawK153j1aP8gLl
072kCjTWyLOIWA1nhhoKKadcIYgmYG7GF3VMXceprrBPIMmRPRrCfRGErqVhxK3hvc8
0732uiyN3YDbpOHClnVe9PYjJZIVSswSXwYZKZkkRkAQKLgDTCs
074-----END CERTIFICATE-----
075[dimanche 27 novembre 2022, 18:42:33 (UTC+0100)] Your cert is in: /root/acme/data/example.com_ecc/example.com.cer
076[dimanche 27 novembre 2022, 18:42:33 (UTC+0100)] Your cert key is in: /root/acme/data/example.com_ecc/example.com.key
077[dimanche 27 novembre 2022, 18:42:33 (UTC+0100)] The intermediate CA cert is in: /root/acme/data/example.com_ecc/ca.cer
078[dimanche 27 novembre 2022, 18:42:33 (UTC+0100)] And the full chain certs is there: /root/acme/data/example.com_ecc/fullchain.cer
079Vous avez du nouveau courrier dans /var/mail/root
080root@web:~ #
Retirer les numéros de lignes

À ce moment là, nous avons un certificat pour notre nom de domaine "example.com" et tous ces sous domaines "*.example.com"

Ce n'est pas forcement nécessaire, vous pouvez créer un certificat en plus pour "ftp.example.com" ; à vous de voir - ce permet d'avoir un/des certificats pour chaque machine, type de service.

TODO Note de Moi-même : Il y a des "get options" à la commande acme.sh comme --reloadcmd et --renew-hook. À tester, pour mettre à jour les champs TLSA (DANE).

Créer un certificat pour un "alias de domaine"

Pour faire un certificat Let's Encrypt pour le domaine "domain.com" qui est un DNAME (alias de domaine) de "other_domain.com" la commande serait :

Script avec 1 ligne

001root@web:~ # acme.sh --issue -k ec-384 -d domain.com -d '*.domain.com' --domain-alias other_domain.com --dns dns_nsupdate --server letsencrypt
Retirer les numéros de lignes

Pour faire un certificat Let's Encrypt pour le domaine "domain.com" et tous ses sous-domaine "*.domain.com" ainsi que "other_domain.com" et tous ses sous-domaine "*.other_domain.com" et que "other_domain.com" est un alias de nom de domaine de "domain.com" (--challenge-alias domain.com)

Script avec 1 ligne

001root@web:~ # acme.sh --issue -k ec-384 -d domain.com -d '*.domain.com' --challenge-alias domain.com -d other_domain.com -d '*.other_domain.com' --dns dns_nsupdate --server letsencrypt --force
Retirer les numéros de lignes

Pour vous donner un exemple d'alias de domaine -> lab3w.com est un alias de domaine de lab3w.fr :

Script avec 6 lignes

001root@web:~ # host www.lab3w.com
002lab3w.com has DNAME record lab3w.fr.
003www.lab3w.com is an alias for www.lab3w.fr.
004www.lab3w.fr is an alias for web.lab3w.fr.
005web.lab3w.fr has address 158.69.126.137
006web.lab3w.fr has IPv6 address 2607:5300:60:9389:15:1:0:1
Retirer les numéros de lignes

J'utilise l'algorithme de sécurité de courbes elliptiques (ec) d'une valeur de 384 bits.

Vous pouvez utiliser :

Ou d'autres algorithme moins récents.

Configurer les certificats Let's Encrypt à votre serveur Web Apache :

Ajouter votre certificat SSL à votre site Web HTTPS "*.example.com:443"

Script avec 20 lignes


001<IfModule mod_ssl.c>
002<VirtualHost [2607:5300:0060:9389:0015:0001:000a:0010]:443 10.101.150.10:443>
003
004	ServerName example.com
005	ServerAlias *.example.com
006	
007	SSLEngine On
008
009#       SSLProtocol -all +SSLv2
010#       SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
011#       SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
012	
013	SSLCertificateFile /root/acme/data/example.com_ecc/example.com.cer
014	SSLCertificateKeyFile /root/acme/data/example.com_ecc/example.com.key
015	SSLCACertificateFile /root/acme/data/example.com_ecc/ca.cer
016        
017	[...]
018	
019</VirtualHost>
020</IfModule>
Retirer les numéros de lignes

SSL configuration serveur Web :

Informations, scripts sur certificats SSL/TLS :

Je vous ajoute 2 scripts (vraiment à l'arache, çà peut aider) :

  1. Un pour tester la validité de certificats SSL, en ressortant la signature numérique du certificat et celle de la Ressource Records (l'enregistrement) TLSA (DANE).
  2. Et l'autre pour envoyer/déployer ses certificats SSL sur d'autres machines

1. Vérifier la date d'expiration d'un certificats SSL/TLS :

On créait un fichier : vim /root/acme-certif-date_verification.bash

Script avec 224 lignes

001#!/bin/bash
002#-----------------------------------
003# Checking certificates SSL date expiration
004#-----------------------------------
005# Author : O.Romain.Jaillet-ramey (orj AT lab3w DOT fr)
006# Date created : 20221201
007# Date modified : 20231222
008#-----------------------------------
009
010#-----------------------------------
011# Config de la clef DNS pour l'update
012key_file="/root/Kupdate-dd-zone.+157+09856.private"
013maj_nsupdate=1
014
015# Config Let's Encrypt dir
016dir_certs="/root/acme/data/"
017#dir_certs="/etc/ssl/letsencrypt/"
018
019# Config Let's Encrypt check domains
020domains="lab3w.fr zw3b.fr zw3b.tv zw3b.site zw3b.com zw3b.net zw3b.blog zw3b.eu ipv10.net mail.zw3b.eu"
021#domains="lab3w.lan"
022
023#----------------------------------
024# ZIMBRA MAIL SERVER UPDATE CERTICATE
025# 20240509
026
027# Config private key SSH for update on zimbra mail server
028ssh_public_key="/root/.ssh/id_ecdsa.pub"
029zimbra_mail_server_addr="10.104.0.1"
030zimbra_mail_server_user="root"
031
032# Value to ssh-agent (for loggin automatic -> https://howto.zw3b.fr/linux/reseaux/ssh-scp-par-certificats)
033auth=`find /tmp -user $LOGNAME -type s -name "*agent*" -print 2>/dev/null`
034SSH_AUTH_SOCK=$auth
035export SSH_AUTH_SOCK
036
037#-----------------------------------
038
039#------------------------------------------------------------------------------------------------------
040for domain in ${domains}; do
041
042#       expiryDate="$(echo $(date -d "$(echo | openssl s_client -servername ${domain} -connect ${domain}:443 -verify_quiet | openssl x509 -enddate -noout | awk -F= '{print $2}')"))"
043        expiryDate="$(echo $(date -d "$(echo | openssl x509 -in ${dir_certs}${domain}_ecc/${domain}.cer -enddate -noout | awk -F= '{print $2}')"))"
044
045#       expiryDays=$(( ($(date -d "$(echo | openssl s_client -servername ${domain} -connect ${domain}:443 -verify_quiet | openssl x509 -enddate -noout | awk -F= '{print $2}')" '+%s') - $(date '+%s')) / 86400 ))
046        expiryDays=$(( ($(date -d "$(echo | openssl x509 -in ${dir_certs}${domain}_ecc/${domain}.cer -enddate -noout | awk -F= '{print $2}')" '+%s') - $(date '+%s')) / 86400 ))
047
048        renewDay=$(($expiryDays - 30))
049
050        subjectAltName=$(echo | openssl x509 -noout -ext subjectAltName -in ${dir_certs}${domain}_ecc/${domain}.cer | grep DNS | tr -d [:blank:])
051#       subjectAltName=$(echo | openssl s_client -servername ${domain} -connect ${domain}:443 -verify_quiet | openssl x509 -noout -ext subjectAltName -noout | grep DNS | tr -d [:blank:])
052
053        signature_certif=$(openssl x509 -noout -fingerprint -sha256 < ${dir_certs}${domain}_ecc/${domain}.cer | tr -d : | cut -d"=" -f2)
054        signature_ondns=$(dig TLSA _443._tcp.${domain} @dns.google +short | awk {'print $4$5'})
055
056        old="$IFS"
057        IFS=","
058        tab=( $subjectAltName )
059        IFS="$old"
060        echo "#-----------------------------------"
061        echo "Domain : ${domain}"
062        echo "#----------"
063        echo ""
064        echo "Certificats SSL expiration date : ${expiryDate}"
065        echo "Certificats SSL expiration days : ${expiryDays}"
066#       echo "Subject Alt Names : ${subjectAltName}"
067        echo ""
068        echo "Subject Alt Names :"
069        echo " \ "
070        for (( i=0 ; i<${#tab[*]} ; i++ )) ; do
071                echo "  +-> "${tab[$i]}
072        done
073        echo ""
074        echo "Certificat Signature check :"
075        echo " \ "
076        echo "  +-" ${signature_certif} "-> Certificat signature"
077        if [ -n "${signature_ondns}" ]
078        then
079                echo "  +-" ${signature_ondns} "-> Signature on DNS RR TLSA"
080        fi
081        if [ -z "${signature_ondns}" ]
082        then
083                echo "   \ "
084                echo "    +--> NO DNS RR TLSA (DANE)"
085        fi
086        if [ "${signature_certif}" = "${signature_ondns}" ]
087        then
088                echo "   \ "
089                echo "    +--> DNS RR TLSA (DANE) on Cerfificat Signature - OK"
090        fi
091
092        if [ "${signature_certif}" != "${signature_ondns}" ] && [ -n "${signature_ondns}" ]
093        then
094                echo "   \ "
095                echo "    +--> DNS RR TLSA (DANE) on Cerfificat Signature - NO OK"
096                echo "     \ "
097                echo "      +--> Update your DNS RR TLSA (DANE) with \"nsupdate\" command"
098                echo "      |"
099                echo "      | ; example"
100                echo "      | server dns.ipv10.net"
101                echo "      | ;"
102
103                for (( i=0 ; i<${#tab[*]} ; i++ )) ; do
104#                       ntab[$i]=$(echo ${tab[$i]} | awk 'BEGIN { FS = ":" }; { if($2 !~ /\*/ ) print $2 }')
105                        ntab[$i]=$(echo ${tab[$i]} | awk 'BEGIN { FS = ":" }; { print $2 }')
106                        dtab[$i]=$(echo ${ntab[$i]} | awk 'BEGIN { FS="."} { print $(NF-1)"."$(NF); }')
107                        ntab[$i]=$(echo ${ntab[$i]} | sed -e "s/\*/www/g")
108
109                        if [ "${ntab[$i]}" != "" ]
110                        then
111                                if [[ "${ntab[$i]}" =~ .*"${dtab[$i]}".* ]]; then
112                                        echo "      | ; MAJ FOR WEB"
113                                        echo "      | zone ${dtab[$i]}"
114                                        echo "      | ; DANE RRset TLSA HTTP Secure"
115                                        echo "      | update del _443._tcp.${ntab[$i]}. 3600 TLSA"
116                                        echo "      | update add _443._tcp.${ntab[$i]}. 3600 TLSA 3 0 1 ${signature_certif}"
117                                        echo "      | send"
118                                        echo "      |"
119                                fi
120                                                   
121                                if [[ "${domain}" == "mail.zw3b.eu" ]] && [[ "${ntab[$i]}" =~ .*"${dtab[$i]}".* ]]; then
122                                        if [[ "${ntab[$i]}" =~ .*"smtp".* ]]; then
123                                                echo "      | ; MAJ FOR MX"
124                                                echo "      | zone ${dtab[$i]}"
125                                                echo "      | ; DANE RRset TLSA SMTP"
126                                                echo "      | update del _25._tcp.${ntab[$i]}. 3600 TLSA"
127                                                echo "      | update add _25._tcp.${ntab[$i]}. 3600 TLSA 3 0 1 ${signature_certif}"
128                                                echo "      | ; DANE RRset TLSA SMTP Secure"
129                                                echo "      | update del _465._tcp.${ntab[$i]}. 3600 TLSA"
130                                                echo "      | update add _465._tcp.${ntab[$i]}. 3600 TLSA 3 0 1 ${signature_certif}"
131                                                echo "      | ; DANE RRset TLSA SMTP Submission"
132                                                echo "      | update del _587._tcp.${ntab[$i]}. 3600 TLSA"
133                                                echo "      | update add _587._tcp.${ntab[$i]}. 3600 TLSA 3 0 1 ${signature_certif}"
134                                                echo "      | send"
135                                                echo "      |"
136                                        fi
137                                fi
138                        fi
139                done
140                echo "      +------------------------------------"
141                echo ""
142
143                #--------------------------------
144                if [ "${maj_nsupdate}" -eq 1 ]
145                then
146                (
147                echo ";----------------------------------"
148                echo "; MAJ NSUPDATE...."
149                echo ";-------"
150                echo "server dns.ipv10.net"
151                echo ";-------"
152                echo ""
153                for (( i=0 ; i<${#tab[*]} ; i++ )) ; do
154#                       ntab[$i]=$(echo ${tab[$i]} | awk 'BEGIN { FS = ":" }; { if($2 !~ /\*/ ) print $2 }')
155                        ntab[$i]=$(echo ${tab[$i]} | awk 'BEGIN { FS = ":" }; { print $2 }')
156                        dtab[$i]=$(echo ${ntab[$i]} | awk 'BEGIN { FS="."} { print $(NF-1)"."$(NF); }')
157                        ntab[$i]=$(echo ${ntab[$i]} | sed -e "s/\*/www/g")
158
159                        if [ "${ntab[$i]}" != "" ]
160                        then
161                                if [[ "${ntab[$i]}" =~ .*"${dtab[$i]}".* ]]; then
162                                        echo "; MAJ FOR WEB"
163                                        echo "zone ${dtab[$i]}"
164                                        echo "; DANE RRset TLSA HTTP Secure"
165                                        echo "update del _443._tcp.${ntab[$i]}. 3600 TLSA"
166                                        echo "update add _443._tcp.${ntab[$i]}. 3600 TLSA 3 0 1 ${signature_certif}"
167                                        echo "send"
168                                        echo ""
169                                fi
170
171                                if [[ "${domain}" == "mail.zw3b.eu" ]] && [[ "${ntab[$i]}" =~ .*"${dtab[$i]}".* ]]; then
172                                        if [[ "${ntab[$i]}" =~ .*"smtp".* ]]; then
173                                                echo "; MAJ FOR MX"
174                                                echo "zone ${dtab[$i]}"
175                                                echo "; DANE RRset TLSA SMTP"
176                                                echo "update del _25._tcp.${ntab[$i]}. 3600 TLSA"
177                                                echo "update add _25._tcp.${ntab[$i]}. 3600 TLSA 3 0 1 ${signature_certif}"
178                                                echo "; DANE RRset TLSA SMTP Secure"
179                                                echo "update del _465._tcp.${ntab[$i]}. 3600 TLSA"
180                                                echo "update add _465._tcp.${ntab[$i]}. 3600 TLSA 3 0 1 ${signature_certif}"
181                                                echo "; DANE RRset TLSA SMTP Submission"
182                                                echo "update del _587._tcp.${ntab[$i]}. 3600 TLSA"
183                                                echo "update add _587._tcp.${ntab[$i]}. 3600 TLSA 3 0 1 ${signature_certif}"
184                                                echo "send"
185                                                echo ""
186                                        fi
187                                fi
188                        fi
189                done
190                echo ";----------------------------------"
191                ) | nsupdate -k ${key_file} -v
192
193                # ZIMBRA SCRIPT
194                # 20240509
195                if [ "${domain}" == "mail.zw3b.eu" ]; then
196                        echo "      +--> Update Certificate on mail server \"${domain}\""
197                        echo "      |"
198                        echo "       \\"
199                        echo "        +--> RSYNC"
200                        rsync -av -e ssh -i ${ssh_public_key} /root/acme/data/${domain}_ecc/ ${zimbra_mail_server_user}@${zimbra_mail_server_addr}:/opt/zimbra/ssl/letsencrypt_ecc/
201                        echo "        +--> Add Signature Certificat of ISRG Root X1 (Internet Security Research Group) to my certificate"
202                        ssh ${zimbra_mail_server_user}@${zimbra_mail_server_addr} -i ${ssh_public_key} -x "cat /root/ISRG-X1.pem >>  /opt/zimbra/ssl/letsencrypt_ecc/fullchain.cer ; sudo chown zimbra:zimbra /opt/zimbra/ssl/letsencrypt_ecc/${domain}.key"
203                        echo "        +--> Verfication Certificate Chain by Zimbra command"
204                        ssh ${zimbra_mail_server_user}@${zimbra_mail_server_addr} -i ${ssh_public_key} -x "sudo su - zimbra -c '/opt/zimbra/bin/zmcertmgr verifycrt comm /opt/zimbra/ssl/letsencrypt_ecc/${domain}.key /opt/zimbra/ssl/letsencrypt_ecc/${domain}.cer /opt/zimbra/ssl/letsencrypt_ecc/fullchain.cer'"
205                        echo "        +--> Change old certicate to new certificate commercial"
206                        ssh ${zimbra_mail_server_user}@${zimbra_mail_server_addr} -i ${ssh_public_key} -x "sudo cp /opt/zimbra/ssl/letsencrypt_ecc/${domain}.key /opt/zimbra/ssl/zimbra/commercial/commercial.key ; sudo chown zimbra:zimbra /opt/zimbra/ssl/zimbra/commercial/commercial.key"
207                        echo "        +--> Finally deploy the new Let’s Encrypt SSL certificate."
208                        ssh ${zimbra_mail_server_user}@${zimbra_mail_server_addr} -i ${ssh_public_key} -x "sudo su - zimbra -c '/opt/zimbra/bin/zmcertmgr deploycrt comm /opt/zimbra/ssl/letsencrypt_ecc/${domain}.cer /opt/zimbra/ssl/letsencrypt_ecc/fullchain.cer'"
209                        echo "        +--> Restart Mail server Zimbra"
210                        ssh ${zimbra_mail_server_user}@${zimbra_mail_server_addr} -i ${ssh_public_key} -x "/etc/init.d/zimbra restart"
211                fi
212                # ZIMBRA SCRIPT
213                
214                fi
215                #--------------------------------
216
217        fi
218        echo ""
219done
220
221echo "#-----------------------------------"
222echo ""
223
224exit 1
Retirer les numéros de lignes

Donner les droits d'executer à l'utilisateur "chmod u+x /root/acme-certif-date_verification.bash" ;
puis lancer le script "/root/acme-certif-date_verification.bash".

Vous retournera quelque chose comme çà :

Script avec 571 lignes

001root@web:~ # /root/acme-certif-date_verification.bash
002#-----------------------------------
003Domain : lab3w.fr
004#----------
005
006Certificats SSL expiration date : samedi 23 septembre 2023, 23:51:07 (UTC+0200)
007Certificats SSL expiration days : 46
008
009Subject Alt Names :
010 \ 
011  +-> DNS:*.lab3w.com
012  +-> DNS:*.lab3w.fr
013  +-> DNS:lab3w.com
014  +-> DNS:lab3w.fr
015
016Certificat Signature check :
017 \ 
018  +- ECFFB8AEA0FF53484F21294E4F69C39CF34F4D7390CAAC66B8C8B0A50657EA50 -> Certificat signature
019  +- ECFFB8AEA0FF53484F21294E4F69C39CF34F4D7390CAAC66B8C8B0A50657EA50 -> Signature on DNS RR TLSA
020   \ 
021    +--> DNS RR TLSA (DANE) on Cerfificat Signature - OK
022
023#-----------------------------------
024Domain : zw3b.fr
025#----------
026
027Certificats SSL expiration date : vendredi 22 septembre 2023, 23:23:36 (UTC+0200)
028Certificats SSL expiration days : 45
029
030Subject Alt Names :
031 \ 
032  +-> DNS:api.zw3b.fr
033  +-> DNS:howto.zw3b.fr
034  +-> DNS:mailing.zw3b.fr
035  +-> DNS:radio.zw3b.fr
036  +-> DNS:www.zw3b.fr
037  +-> DNS:zw3b.fr
038
039Certificat Signature check :
040 \ 
041  +- C1A68D384582BC4A88EC7DB3492678B1B6A6E088036FD90306F4F47AF5B7332D -> Certificat signature
042  +- C1A68D384582BC4A88EC7DB3492678B1B6A6E088036FD90306F4F47AF5B7332D -> Signature on DNS RR TLSA
043   \ 
044    +--> DNS RR TLSA (DANE) on Cerfificat Signature - OK
045
046#-----------------------------------
047Domain : zw3b.tv
048#----------
049
050Certificats SSL expiration date : vendredi 22 septembre 2023, 23:24:59 (UTC+0200)
051Certificats SSL expiration days : 45
052
053Subject Alt Names :
054 \ 
055  +-> DNS:www.zw3b.tv
056  +-> DNS:zw3b.tv
057
058Certificat Signature check :
059 \ 
060  +- 742D5E938E928F0E7F9A87811E0CFE1BE399005E2B2CAC1BBB42971E656C25A3 -> Certificat signature
061  +- 742D5E938E928F0E7F9A87811E0CFE1BE399005E2B2CAC1BBB42971E656C25A3 -> Signature on DNS RR TLSA
062   \ 
063    +--> DNS RR TLSA (DANE) on Cerfificat Signature - OK
064
065#-----------------------------------
066Domain : zw3b.site
067#----------
068
069Certificats SSL expiration date : vendredi 20 octobre 2023, 23:33:51 (UTC+0200)
070Certificats SSL expiration days : 73
071
072Subject Alt Names :
073 \ 
074  +-> DNS:*.zw3b.site
075  +-> DNS:zw3b.site
076
077Certificat Signature check :
078 \ 
079  +- C894DD1ACD81BF4613E69927FB0F7539018165182BA2C4B5587D33A8C9D1E411 -> Certificat signature
080  +- C894DD1ACD81BF4613E69927FB0F7539018165182BA2C4B5587D33A8C9D1E411 -> Signature on DNS RR TLSA
081   \ 
082    +--> DNS RR TLSA (DANE) on Cerfificat Signature - OK
083
084#-----------------------------------
085Domain : zw3b.net
086#----------
087
088Certificats SSL expiration date : vendredi 22 septembre 2023, 23:24:08 (UTC+0200)
089Certificats SSL expiration days : 45
090
091Subject Alt Names :
092 \ 
093  +-> DNS:www.zw3b.net
094  +-> DNS:zw3b.net
095
096Certificat Signature check :
097 \ 
098  +- 992DB6977A23A379BA0378335C26E0855CAA4DEF20D9BC986EE947C6FA9719C9 -> Certificat signature
099  +- 992DB6977A23A379BA0378335C26E0855CAA4DEF20D9BC986EE947C6FA9719C9 -> Signature on DNS RR TLSA
100   \ 
101    +--> DNS RR TLSA (DANE) on Cerfificat Signature - OK
102
103#-----------------------------------
104Domain : zw3b.blog
105#----------
106
107Certificats SSL expiration date : samedi 23 septembre 2023, 23:51:42 (UTC+0200)
108Certificats SSL expiration days : 46
109
110Subject Alt Names :
111 \ 
112  +-> DNS:*.zw3b.blog
113  +-> DNS:zw3b.blog
114
115Certificat Signature check :
116 \ 
117  +- 13B178DBE595C90AF7B461C115B5B2E323AC6403CACB2BA1F62345669DF47F25 -> Certificat signature
118  +- 13B178DBE595C90AF7B461C115B5B2E323AC6403CACB2BA1F62345669DF47F25 -> Signature on DNS RR TLSA
119   \ 
120    +--> DNS RR TLSA (DANE) on Cerfificat Signature - OK
121
122#-----------------------------------
123Domain : zw3b.eu
124#----------
125
126Certificats SSL expiration date : mercredi 20 mars 2024, 23:15:21 (UTC+0200)
127Certificats SSL expiration days : 89
128
129Subject Alt Names :
130 \ 
131  +-> DNS:*.zw3b.eu
132  +-> DNS:zw3b.eu
133
134Certificat Signature check :
135 \ 
136  +- 76B2ABF86AD5D7002B03BAE2C7474E42E6ECA5DC4625BCABFBF9577165784274 -> Certificat signature
137  +- 122DB6977A23A379BA0378335C26E0855CAA4DEF20D9BC986EE947C6FA9719D7 -> Signature on DNS RR TLSA
138   \ 
139    +--> DNS RR TLSA (DANE) on Cerfificat Signature - NO OK
140     \ 
141      +--> Update your DNS RR TLSA (DANE) with "nsupdate" command
142      |
143      | ; example
144      | server dns.ipv10.net
145      | ;
146      | ; MAJ FOR WEB 
147      | zone zw3b.eu
148      | ; DANE RRset TLSA HTTP Secure 
149      | update del _443._tcp.www.zw3b.eu. 3600 TLSA
150      | update add _443._tcp.www.zw3b.eu. 3600 IN TLSA 3 0 1 76B2ABF86AD5D7002B03BAE2C7474E42E6ECA5DC4625BCABFBF9577165784274
151      | update del _443._tcp.zw3b.eu. 3600 TLSA
152      | update add _443._tcp.zw3b.eu. 3600 IN TLSA 3 0 1 76B2ABF86AD5D7002B03BAE2C7474E42E6ECA5DC4625BCABFBF9577165784274
153      | send
154      | 
155      +------------------------------------
156
157#-----------------------------------
158Domain : ipv10.net
159#----------
160
161Certificats SSL expiration date : samedi 23 septembre 2023, 23:49:51 (UTC+0200)
162Certificats SSL expiration days : 46
163
164Subject Alt Names :
165 \ 
166  +-> DNS:*.ipv01.net
167  +-> DNS:*.ipv10.net
168  +-> DNS:ipv01.net
169  +-> DNS:ipv10.net
170
171Certificat Signature check :
172 \ 
173  +- 924CACB8AB876888A3F07BDC9B6B6C39235502161991EECE5EC945174E91E07C -> Certificat signature
174   \ 
175    +--> NO DNS RR TLSA (DANE) on Cerfificat Signature.
176
177#-----------------------------------
178Domain : mail.zw3b.eu
179#----------
180
181Certificats SSL expiration date : mercredi 20 mars 2024, 16:26:36 (UTC+0100)
182Certificats SSL expiration days : 89
183
184Subject Alt Names :
185 \  
186  +-> DNS:imap.zw3b.blog
187  +-> DNS:imap.zw3b.com
188  +-> DNS:imap.zw3b.eu
189  +-> DNS:imap.zw3b.fr
190  +-> DNS:imap.zw3b.net
191  +-> DNS:imap.zw3b.site
192  +-> DNS:imap.zw3b.tv
193  +-> DNS:mail.zw3b.blog
194  +-> DNS:mail.zw3b.com
195  +-> DNS:mail.zw3b.eu
196  +-> DNS:mail.zw3b.fr
197  +-> DNS:mail.zw3b.net
198  +-> DNS:mail.zw3b.site
199  +-> DNS:mail.zw3b.tv
200  +-> DNS:pop.zw3b.blog
201  +-> DNS:pop.zw3b.com
202  +-> DNS:pop.zw3b.eu
203  +-> DNS:pop.zw3b.fr
204  +-> DNS:pop.zw3b.net
205  +-> DNS:pop.zw3b.site
206  +-> DNS:pop.zw3b.tv
207  +-> DNS:smtp.zw3b.blog
208  +-> DNS:smtp.zw3b.com
209  +-> DNS:smtp.zw3b.eu
210  +-> DNS:smtp.zw3b.fr
211  +-> DNS:smtp.zw3b.net
212  +-> DNS:smtp.zw3b.site
213  +-> DNS:smtp.zw3b.tv
214  +-> DNS:webmail.zw3b.blog
215  +-> DNS:webmail.zw3b.com
216  +-> DNS:webmail.zw3b.eu
217  +-> DNS:webmail.zw3b.fr
218  +-> DNS:webmail.zw3b.net
219  +-> DNS:webmail.zw3b.site
220  +-> DNS:webmail.zw3b.tv
221
222Certificat Signature check :
223 \  
224  +- 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F -> Certificat signature
225  +- 738380ECBB58302D80948CAABBD0BBAD62A47F21BB5E29EEECD1E50354491078 -> Signature on DNS RR TLSA
226   \ 
227    +--> DNS RR TLSA (DANE) on Cerfificat Signature - NO OK
228     \
229      +--> Update your DNS RR TLSA (DANE) with "nsupdate" command
230      |
231      | ; example
232      | server dns.ipv10.net
233      | ;
234      | ; MAJ FOR WEB
235      | zone zw3b.blog
236      | ; DANE RRset TLSA HTTP Secure
237      | update del _443._tcp.imap.zw3b.blog. 3600 TLSA
238      | update add _443._tcp.imap.zw3b.blog. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
239      | send
240      |
241      | ; MAJ FOR WEB
242      | zone zw3b.com
243      | ; DANE RRset TLSA HTTP Secure
244      | update del _443._tcp.imap.zw3b.com. 3600 TLSA
245      | update add _443._tcp.imap.zw3b.com. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
246      | send
247      |
248      | ; MAJ FOR WEB
249      | zone zw3b.eu
250      | ; DANE RRset TLSA HTTP Secure
251      | update del _443._tcp.imap.zw3b.eu. 3600 TLSA
252      | update add _443._tcp.imap.zw3b.eu. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
253      | send
254      |
255      | ; MAJ FOR WEB
256      | zone zw3b.fr
257      | ; DANE RRset TLSA HTTP Secure
258      | update del _443._tcp.imap.zw3b.fr. 3600 TLSA
259      | update add _443._tcp.imap.zw3b.fr. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
260      | send
261      |
262      | ; MAJ FOR WEB
263      | zone zw3b.net
264      | ; DANE RRset TLSA HTTP Secure
265      | update del _443._tcp.imap.zw3b.net. 3600 TLSA
266      | update add _443._tcp.imap.zw3b.net. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
267      | send
268      |
269      | ; MAJ FOR WEB
270      | zone zw3b.site
271      | ; DANE RRset TLSA HTTP Secure
272      | update del _443._tcp.imap.zw3b.site. 3600 TLSA
273      | update add _443._tcp.imap.zw3b.site. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
274      | send
275      |
276      | ; MAJ FOR WEB
277      | zone zw3b.tv
278      | ; DANE RRset TLSA HTTP Secure
279      | update del _443._tcp.imap.zw3b.tv. 3600 TLSA
280      | update add _443._tcp.imap.zw3b.tv. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
281      | send
282      |
283      | ; MAJ FOR WEB
284      | zone zw3b.blog
285      | ; DANE RRset TLSA HTTP Secure
286      | update del _443._tcp.mail.zw3b.blog. 3600 TLSA
287      | update add _443._tcp.mail.zw3b.blog. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
288      | send
289      |
290      | ; MAJ FOR WEB
291      | zone zw3b.com
292      | ; DANE RRset TLSA HTTP Secure
293      | update del _443._tcp.mail.zw3b.com. 3600 TLSA
294      | update add _443._tcp.mail.zw3b.com. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
295      | send
296      |
297      | ; MAJ FOR WEB
298      | zone zw3b.eu
299      | ; DANE RRset TLSA HTTP Secure
300      | update del _443._tcp.mail.zw3b.eu. 3600 TLSA
301      | update add _443._tcp.mail.zw3b.eu. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
302      | send
303      |
304      | ; MAJ FOR WEB
305      | zone zw3b.fr
306      | ; DANE RRset TLSA HTTP Secure
307      | update del _443._tcp.mail.zw3b.fr. 3600 TLSA
308      | update add _443._tcp.mail.zw3b.fr. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
309      | send
310      |
311      | ; MAJ FOR WEB
312      | zone zw3b.net
313      | ; DANE RRset TLSA HTTP Secure
314      | update del _443._tcp.mail.zw3b.net. 3600 TLSA
315      | update add _443._tcp.mail.zw3b.net. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
316      | send
317      |
318      | ; MAJ FOR WEB
319      | zone zw3b.site
320      | ; DANE RRset TLSA HTTP Secure
321      | update del _443._tcp.mail.zw3b.site. 3600 TLSA
322      | update add _443._tcp.mail.zw3b.site. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
323      | send
324      |
325      | ; MAJ FOR WEB
326      | zone zw3b.tv
327      | ; DANE RRset TLSA HTTP Secure
328      | update del _443._tcp.mail.zw3b.tv. 3600 TLSA
329      | update add _443._tcp.mail.zw3b.tv. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
330      | send
331      |
332      | ; MAJ FOR WEB
333      | zone zw3b.blog
334      | ; DANE RRset TLSA HTTP Secure
335      | update del _443._tcp.pop.zw3b.blog. 3600 TLSA
336      | update add _443._tcp.pop.zw3b.blog. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
337      | send
338      |
339      | ; MAJ FOR WEB
340      | zone zw3b.com
341      | ; DANE RRset TLSA HTTP Secure
342      | update del _443._tcp.pop.zw3b.com. 3600 TLSA
343      | update add _443._tcp.pop.zw3b.com. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
344      | send
345      |
346      | ; MAJ FOR WEB
347      | zone zw3b.eu
348      | ; DANE RRset TLSA HTTP Secure
349      | update del _443._tcp.pop.zw3b.eu. 3600 TLSA
350      | update add _443._tcp.pop.zw3b.eu. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
351      | send
352      |
353      | ; MAJ FOR WEB
354      | zone zw3b.fr
355      | ; DANE RRset TLSA HTTP Secure
356      | update del _443._tcp.pop.zw3b.fr. 3600 TLSA
357      | update add _443._tcp.pop.zw3b.fr. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
358      | send
359      |
360      | ; MAJ FOR WEB
361      | zone zw3b.net
362      | ; DANE RRset TLSA HTTP Secure
363      | update del _443._tcp.pop.zw3b.net. 3600 TLSA
364      | update add _443._tcp.pop.zw3b.net. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
365      | send
366      |
367      | ; MAJ FOR WEB
368      | zone zw3b.site
369      | ; DANE RRset TLSA HTTP Secure
370      | update del _443._tcp.pop.zw3b.site. 3600 TLSA
371      | update add _443._tcp.pop.zw3b.site. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
372      | send
373      |
374      | ; MAJ FOR WEB
375      | zone zw3b.tv
376      | ; DANE RRset TLSA HTTP Secure
377      | update del _443._tcp.pop.zw3b.tv. 3600 TLSA
378      | update add _443._tcp.pop.zw3b.tv. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
379      | send
380      |
381      | ; MAJ FOR WEB
382      | zone zw3b.blog
383      | ; DANE RRset TLSA HTTP Secure
384      | update del _443._tcp.smtp.zw3b.blog. 3600 TLSA
385      | update add _443._tcp.smtp.zw3b.blog. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
386      | send
387      |
388      | ; MAJ FOR MX
389      | zone zw3b.blog
390      | ; DANE RRset TLSA SMTP
391      | update del _25._tcp.smtp.zw3b.blog. 3600 TLSA
392      | update add _25._tcp.smtp.zw3b.blog. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
393      | ; DANE RRset TLSA SMTP Secure
394      | update del _465._tcp.smtp.zw3b.blog. 3600 TLSA
395      | update add _465._tcp.smtp.zw3b.blog. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
396      | ; DANE RRset TLSA SMTP Submission
397      | update del _587._tcp.smtp.zw3b.blog. 3600 TLSA
398      | update add _587._tcp.smtp.zw3b.blog. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
399      | send
400      |
401      | ; MAJ FOR WEB
402      | zone zw3b.com
403      | ; DANE RRset TLSA HTTP Secure
404      | update del _443._tcp.smtp.zw3b.com. 3600 TLSA
405      | update add _443._tcp.smtp.zw3b.com. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
406      | send
407      |
408      | ; MAJ FOR MX
409      | zone zw3b.com
410      | ; DANE RRset TLSA SMTP
411      | update del _25._tcp.smtp.zw3b.com. 3600 TLSA
412      | update add _25._tcp.smtp.zw3b.com. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
413      | ; DANE RRset TLSA SMTP Secure
414      | update del _465._tcp.smtp.zw3b.com. 3600 TLSA
415      | update add _465._tcp.smtp.zw3b.com. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
416      | ; DANE RRset TLSA SMTP Submission
417      | update del _587._tcp.smtp.zw3b.com. 3600 TLSA
418      | update add _587._tcp.smtp.zw3b.com. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
419      | send
420      |
421      | ; MAJ FOR WEB
422      | zone zw3b.eu
423      | ; DANE RRset TLSA HTTP Secure
424      | update del _443._tcp.smtp.zw3b.eu. 3600 TLSA
425      | update add _443._tcp.smtp.zw3b.eu. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
426      | send
427      |
428      | ; MAJ FOR MX
429      | zone zw3b.eu
430      | ; DANE RRset TLSA SMTP
431      | update del _25._tcp.smtp.zw3b.eu. 3600 TLSA
432      | update add _25._tcp.smtp.zw3b.eu. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
433      | ; DANE RRset TLSA SMTP Secure
434      | update del _465._tcp.smtp.zw3b.eu. 3600 TLSA
435      | update add _465._tcp.smtp.zw3b.eu. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
436      | ; DANE RRset TLSA SMTP Submission
437      | update del _587._tcp.smtp.zw3b.eu. 3600 TLSA
438      | update add _587._tcp.smtp.zw3b.eu. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
439      | send
440      |
441      | ; MAJ FOR WEB
442      | zone zw3b.fr
443      | ; DANE RRset TLSA HTTP Secure
444      | update del _443._tcp.smtp.zw3b.fr. 3600 TLSA
445      | update add _443._tcp.smtp.zw3b.fr. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
446      | send
447      |
448      | ; MAJ FOR MX
449      | zone zw3b.fr
450      | ; DANE RRset TLSA SMTP
451      | update del _25._tcp.smtp.zw3b.fr. 3600 TLSA
452      | update add _25._tcp.smtp.zw3b.fr. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
453      | ; DANE RRset TLSA SMTP Secure
454      | update del _465._tcp.smtp.zw3b.fr. 3600 TLSA
455      | update add _465._tcp.smtp.zw3b.fr. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
456      | ; DANE RRset TLSA SMTP Submission
457      | update del _587._tcp.smtp.zw3b.fr. 3600 TLSA
458      | update add _587._tcp.smtp.zw3b.fr. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
459      | send
460      |
461      | ; MAJ FOR WEB
462      | zone zw3b.net
463      | ; DANE RRset TLSA HTTP Secure
464      | update del _443._tcp.smtp.zw3b.net. 3600 TLSA
465      | update add _443._tcp.smtp.zw3b.net. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
466      | send
467      |
468      | ; MAJ FOR MX
469      | zone zw3b.net
470      | ; DANE RRset TLSA SMTP
471      | update del _25._tcp.smtp.zw3b.net. 3600 TLSA
472      | update add _25._tcp.smtp.zw3b.net. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
473      | ; DANE RRset TLSA SMTP Secure
474      | update del _465._tcp.smtp.zw3b.net. 3600 TLSA
475      | update add _465._tcp.smtp.zw3b.net. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
476      | ; DANE RRset TLSA SMTP Submission
477      | update del _587._tcp.smtp.zw3b.net. 3600 TLSA
478      | update add _587._tcp.smtp.zw3b.net. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
479      | send
480      |
481      | ; MAJ FOR WEB
482      | zone zw3b.site
483      | ; DANE RRset TLSA HTTP Secure
484      | update del _443._tcp.smtp.zw3b.site. 3600 TLSA
485      | update add _443._tcp.smtp.zw3b.site. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
486      | send
487      |
488      | ; MAJ FOR MX
489      | zone zw3b.site
490      | ; DANE RRset TLSA SMTP
491      | update del _25._tcp.smtp.zw3b.site. 3600 TLSA
492      | update add _25._tcp.smtp.zw3b.site. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
493      | ; DANE RRset TLSA SMTP Secure
494      | update del _465._tcp.smtp.zw3b.site. 3600 TLSA
495      | update add _465._tcp.smtp.zw3b.site. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
496      | ; DANE RRset TLSA SMTP Submission
497      | update del _587._tcp.smtp.zw3b.site. 3600 TLSA
498      | update add _587._tcp.smtp.zw3b.site. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
499      | send
500      |
501      | ; MAJ FOR WEB
502      | zone zw3b.tv
503      | ; DANE RRset TLSA HTTP Secure
504      | update del _443._tcp.smtp.zw3b.tv. 3600 TLSA
505      | update add _443._tcp.smtp.zw3b.tv. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
506      | send
507      |
508      | ; MAJ FOR MX
509      | zone zw3b.tv
510      | ; DANE RRset TLSA SMTP
511      | update del _25._tcp.smtp.zw3b.tv. 3600 TLSA
512      | update add _25._tcp.smtp.zw3b.tv. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
513      | ; DANE RRset TLSA SMTP Secure
514      | update del _465._tcp.smtp.zw3b.tv. 3600 TLSA
515      | update add _465._tcp.smtp.zw3b.tv. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
516      | ; DANE RRset TLSA SMTP Submission
517      | update del _587._tcp.smtp.zw3b.tv. 3600 TLSA
518      | update add _587._tcp.smtp.zw3b.tv. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
519      | send
520      |
521      | ; MAJ FOR WEB
522      | zone zw3b.blog
523      | ; DANE RRset TLSA HTTP Secure
524      | update del _443._tcp.webmail.zw3b.blog. 3600 TLSA
525      | update add _443._tcp.webmail.zw3b.blog. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
526      | send
527      |
528      | ; MAJ FOR WEB
529      | zone zw3b.com
530      | ; DANE RRset TLSA HTTP Secure
531      | update del _443._tcp.webmail.zw3b.com. 3600 TLSA
532      | update add _443._tcp.webmail.zw3b.com. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
533      | send
534      |
535      | ; MAJ FOR WEB
536      | zone zw3b.eu
537      | ; DANE RRset TLSA HTTP Secure
538      | update del _443._tcp.webmail.zw3b.eu. 3600 TLSA
539      | update add _443._tcp.webmail.zw3b.eu. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
540      | send
541      |
542      | ; MAJ FOR WEB
543      | zone zw3b.fr
544      | ; DANE RRset TLSA HTTP Secure
545      | update del _443._tcp.webmail.zw3b.fr. 3600 TLSA
546      | update add _443._tcp.webmail.zw3b.fr. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
547      | send
548      |
549      | ; MAJ FOR WEB
550      | zone zw3b.net
551      | ; DANE RRset TLSA HTTP Secure
552      | update del _443._tcp.webmail.zw3b.net. 3600 TLSA
553      | update add _443._tcp.webmail.zw3b.net. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
554      | send
555      |
556      | ; MAJ FOR WEB
557      | zone zw3b.site
558      | ; DANE RRset TLSA HTTP Secure
559      | update del _443._tcp.webmail.zw3b.site. 3600 TLSA
560      | update add _443._tcp.webmail.zw3b.site. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
561      | send
562      |
563      | ; MAJ FOR WEB
564      | zone zw3b.tv
565      | ; DANE RRset TLSA HTTP Secure
566      | update del _443._tcp.webmail.zw3b.tv. 3600 TLSA
567      | update add _443._tcp.webmail.zw3b.tv. 3600 TLSA 3 0 1 6A42E98D3EADBB58C37A4127CEF3BB8BD004AC8DA39EE14F46549E52C75F1C4F
568      | send
569      |
570      +------------------------------------
571    
Retirer les numéros de lignes

C'est juste pour information (on n'a pas besoin forcement de ce script), çà peut nous servir. Note de Moi-même 2023/12/14 : C'était avant çà.

Note de Moi-même 2023/12/14 : J'ai ajouté la commande nsupdate (ligne 123 (101-127)) au script pour qu'il mette à jour les RR TLSA HTTPs sur le serveur DNS par nsupdate, si le certificat TLS Let's Encrypt change.
Note de Moi-même 2023/12/22 : J'ai ajouté la commande nsupdate au script pour qu'il mette à jour les RR TLSA SMTPs sur le serveur DNS par nsupdate, si le certificat TLS Let's Encrypt change.
Note de Moi-même 2023/12/25 : J'ai remarqué un truc "embêtant" ; sur les certificats en domaines wildcard, dans le script ci-dessus je prend en compte "domain.tld" et "www.domain.tld" et met à jour les champs TLSA ; mais donc, vu que c'est un wilcard je peut, donc signer DANE pour "admin.domain.tld" ou "sub.domain.tld" mais -- comment le savoir automatiquement -- il faut mettre à jour manuellement - Une autre solution, serait de faire d'autres certificats gratuit Let's Encrypt -- bien précis pour "admin" et ne pas utiliser le wilcard -- selon sa stratégie de sécurité ;) vous comprennez.

J'ai écris ce commentaire aujourd'hui sur Debian-FR pour "mieux" ré-écrire une de mes ligne.

Un exemple de mise a jour dynamique par « nsupdate » avec retour d'erreur ici .

Vous remarquerez que je vous parle des RR (Ressources Recors DNS) TLSA du protocole/mécanisme DANE (DNS - based Authentication of Named Entities) qui s'appuie sur le DNS pour authentifier des entités applicatives.
Par exemple pour les applications Web, vous pouvez utiliser "DNSSEC/DANE Validator " ; plugin Firefox qui vous permet de vérifier l'existence et la validité des enregistrements DNSSEC et TLSA liés aux noms de domaine.

Donc, normalement si vous avez suivis la procédure du dessus, acme.sh [...] --dns dns_nsupdate met à jour nos certificats SSL/TLS Let's Encrypt tous les 60 jours, 30 jours avant l'expiration (le certificat en valide 90 jours) (AUTO_UPGRADE='1' dans /root/acme/myaccount.conf).

Par contre, si vous avez besoin de déployer vos certificats SSL/TLS sur vos proxy, load balancer frontaux, clusters ou autres serveurs (HTTP, FTP etc.), ci-dessous un exemple.

2. Déployer vos certificats SSL/TLS sur d'autres serveurs :

Si vous avez besoin d'utiliser vos certificats sur d'autres machines.

Ci-dessous un script RSYNC pour envoyer vos certificats sur d'autres machines serveurs.

On créait un fichier : root@web:~ # vim /root/acme-certif-frontend.bash

Script avec 204 lignes

001#!/bin/bash
002#-----------------------------------
003# RSYNC script for tranfert SSL/TLS certificats files modified on others servers
004#-----------------------------------
005# Author : O.Romain.Jaillet-ramey (orj AT lab3w DOT fr)
006# Date created : 20221201 
007# Date modified : 20230920
008#-----------------------------------
009
010#------------------------------------------------------------------------------------------------------
011# Authentification par certicats (sans humain)
012#-----
013auth=`find /tmp -user $LOGNAME -type s -name "*agent*" -print 2>/dev/null`
014SSH_AUTH_SOCK=$auth
015export SSH_AUTH_SOCK
016#------------------------------------------------------------------------------------------------------
017
018#------------------------------------------------------------------------------------------------------
019# Config
020#-----
021
022dir="/root/acme/data/"
023#files_extension=".cer .key"
024
025#------------------------------------------------------------------------------------------------------
026# Files/Dir of certicats Domains to check with rsync
027# ${dir}${domain}_ecc/
028#-----
029
030domains="lab3w.fr zw3b.fr zw3b.tv zw3b.site zw3b.net zw3b.blog zw3b.eu ipv10.net"
031#domains="lab3w.lan"
032
033#------------------------------------------------------------------------------------------------------
034# Remote servers on which SSL certificates are needed
035#-----
036rservers="lb1.lab3w.lan lb2.lab3w.lan server.lab3w.com"
037
038rdir="/etc/ssl/letsencrypt/"
039ruser="root"
040rkey=".ssh/id_ecdsa"
041rport="22"
042
043#------------------------------------------------------------------------------------------------------
044# texts
045#-----
046
047text_file=()
048text_file_ca=()
049text_server=()
050
051#------------------------------------------------------------------------------------------------------
052# script
053#-----
054
055for rserver in ${rservers}; do
056
057text_status=()
058text_status_ca=()
059text_domain=()
060
061text_files=()
062
063text_server=("${rserver}")
064
065#------------------------------------------------------------------------------------------------------
066# script authenfication
067#-----
068
069if ! ssh -p ${rport} -i ${rkey} ${ruser}@${rserver} "test pwd"; then
070    echo "Authentication failed !"
071    echo "Exit !"
072    exit 2
073fi
074
075#------------------------------------------------------------------------------------------------------
076
077echo "#------------------------------------------------"
078echo "SERVER : ${rserver}"
079echo ""
080
081#------------------------------------------------------------------------------------------------------
082# script RSYNC
083#-----
084
085for domain in ${domains}; do
086
087        text_files=("${domain}")
088
089        if ! ssh -p ${rport} -i ${rkey} ${ruser}@${rserver} "test -x ${rdir}${domain}_ecc"; then
090#               echo "The remote directory "${rdir}${domain}_ecc" do not exist"
091#               echo "Create directory"
092                ssh -p ${rport} -i ${rkey} ${ruser}@${rserver} "mkdir -p ${rdir}${domain}_ecc"
093
094                if ! ssh -p ${rport} -i ${rkey} ${ruser}@${rserver} "test -x ${rdir}${domain}_ecc"; then
095#                       echo "The remote directory "${rdir}${domain}_ecc" could not be created or has bad permissions."
096#                       echo "Exit !"
097                        exit 2
098                fi
099
100#               echo "Remote directory "${rdir}${domain}_ecc" OK !"
101#               echo ""
102        fi
103
104#        for ext in ${files_extension}; do
105#               output=$(rsync -a --info=NAME -e "ssh -i ${rkey}" ${dir}${domain}_ecc/${domain}${ext} ${ruser}@${rserver}:${rdir}${domain}_ecc/${domain}${ext})
106                output=$(rsync -a --info=NAME -e "ssh -i ${rkey}" ${dir}${domain}_ecc/ ${ruser}@${rserver}:${rdir}${domain}_ecc/)
107                if [ "output_${output}" = "output_" ]; then
108                        text_status+=( "$(printf "%dn" $?)" )
109                        text_domain+=( "${domain}" )
110                        text_file+=( "${dir}${domain}_ecc/${output}" )
111
112                else
113                        text_status+=(150)
114                        text_domain+=( "${domain}" )
115                        text_file+=( "${dir}${domain}_ecc/${output}" )
116
117#                       text_files+=( "${domain}", "${dir}${domain}_ecc/${output}" )
118
119                fi
120#                rsync -a -e "ssh -i ${rkey}" ${dir}${domain}_ecc/ca.cer ${ruser}@${rserver}:${rdir}${domain}_ecc/ca.cer
121#               status_ca+=( "$(printf "%dn" $?)" )
122#        done
123done # files
124
125
126#done # rservers
127
128#------------------------------------------------------------------------------------------------------
129# Restart servers
130#----
131
132restart_server=0
133
134msg=""
135i=0
136for code in "${text_status[@]}"; do
137
138#       msg+="# MSG $i : ${file_cert[$i]}n"
139
140#       echo "Code : ${code}"
141        if [ ${code} -eq 150 ]; then
142
143                msg+="#------------------------n"
144                msg+="# Server : ${text_server}n"
145                msg+="# Domain : ${text_domain[$i]}n"
146                msg+="# Files  : ${text_file[$i]} is modified (status : ${text_status[$i]})n"
147
148#               for file in "${text_files[${text_domain[$i]}]}"; do
149#                       msg+="# File : ${file} is modifiedn"
150#               done
151
152                msg+="#------------------------n"
153
154                restart_server=1
155        fi
156
157        i=$((${i} + 1))
158done
159
160if [ "_$msg" != "_" ]; then
161        echo -e $msg
162fi
163
164
165if [ ${restart_server} -eq 1 ]; then
166
167        for code in "${text_server[@]}"; do
168
169                # nodes servers
170                ssh -p ${rport} -i ${rkey} ${ruser}@${rserver} "/etc/init.d/apache2 reload"
171
172                echo "#---> Server Apache ${rserver} reloading"
173
174        done
175
176else
177        echo "#---> Server Apache ${rserver} do not reloading (no update certificat)"
178fi
179
180echo ""
181echo "#------------------------------------------------"
182echo ""
183
184done # rservers
185
186#------------------------------------------------------------------------------------------------------
187
188echo "SERVER : LOCAL"
189echo ""
190if [ ${restart_server} -eq 1 ]; then
191
192        # local server
193        /etc/init.d/apache2 reload
194        echo "#---> Server Apache LOCAL reloading"
195
196else
197        echo "#---> Server Apache LOCAL do not reloading (no update certificat)"
198fi
199
200echo ""
201echo "#------------------------------------------------"
202echo ""
203
204#------------------------------------------------------------------------------------------------------
Retirer les numéros de lignes

Pour les lignes "10 à 16" du script ci-dessus "l'authentification avec une paire de clefs", j'ai écris une documentation ici : SSH - SCP par certificats .


Pour lancer la mise à jour par rsync (qui enverra les fichiers (seulement s'ils ont changés) sur les autres serveurs) :

Script avec 1 ligne

001root@web:~ # /root/acme-certif-frontend.bash
Retirer les numéros de lignes

La commande envoie les fichiers modifiés sur les autres serveurs et redémare les serveurs Web Apache.

Il faut faire une tâche planifiée tous les jours à l'heure que vous voulez pour rester à jour niveau certificats SSL/TLS.

Par exemple mes tâches planifiées pour ce service ressemble à çà :

Script avec 4 lignes

001root@web:~ # crontab -l
002# Lets Encrypt (ACME)
00300 00 * * * sleep $(shuf -i 0-3600 -n1) ; "/root/acme"/acme.sh --cron --home "/root/acme" --config-home "/root/acme/data" ; /root/acme-certif-frontend.bash | mail -s "[ZW3B][DNSSEC] Acme + Rsync" "email_1@domain.fr,email_2@domain.fr" > /dev/null
00401 00 * * * /root/acme-certif-date_verification.bash | mail -s "[ZW3B][DNSSEC] Date Verification" "email_1@domain.fr,email_2@domain.fr" 1>>/var/log/syslog 2>/dev/null 2>&1
Retirer les numéros de lignes

Il manque toujours la mise à jour des champs TLSA du protocole/mécanisme DANE, mais avec cela on a nos sites Web valident et sécurisés et les certificats SSL/TLS transférés et mis à jour sur vos frontaux et sur les autres machines.


Note de Moi-même du 2023/12/22 : J'ai ajouté au script acme-certif-date_verification.bash les mises à jour DNS TLSA du protocole/mécanisme DANE qui sont expliquées" ci-dessous.

Note de Moi-même du 2023/08/08 : Si, vous avez configuré vos champs TLSA du protocole/mécanisme DANE (DNS - based Authentication of Named Entities) qui s'appuie sur le DNS pour authentifier des entités applicatives ; il faut/faudra mettre à jour les RR (Ressource Records) TLSA chaque fois que le certificat TLS/SSL (Let's Encrypt) est mis à jour, renouvelé par acme.sh (tout le 60 jours).

On va donc utiliser "nsupdate" pour mettre à jour dynamiquement les champs d'enregistrement (RR) TLSA (DANE).

Je vous "pose" un exemple :

Script avec 25 lignes

001root@web:~ # vim /root/nsupdate-zw3b_fr.nsupdate
002;
003server dns.ipv10.net
004zone zw3b.fr
005;----------------------
006; UPDATE DANE
007; openssl x509 -noout -fingerprint -sha256 < /root/acme/data/zw3b.fr_ecc/zw3b.fr.cer | tr -d :
008; dig TLSA _443._tcp.zw3b.fr @dns.google +short
009; ------
010;
011update del _443._tcp.zw3b.fr. 3600 TLSA
012update add _443._tcp.zw3b.fr. 3600 IN TLSA 3 0 1 C1A68D384582BC4A88EC7DB3492678B1B6A6E088036FD90306F4F47AF5B7332D
013update del _443._tcp.www.zw3b.fr. 3600 TLSA
014update add _443._tcp.www.zw3b.fr. 3600 IN TLSA 3 0 1 C1A68D384582BC4A88EC7DB3492678B1B6A6E088036FD90306F4F47AF5B7332D
015update del _443._tcp.api.zw3b.fr. 3600 TLSA
016update add _443._tcp.api.zw3b.fr. 3600 IN TLSA 3 0 1 C1A68D384582BC4A88EC7DB3492678B1B6A6E088036FD90306F4F47AF5B7332D
017update del _443._tcp.howto.zw3b.fr. 3600 TLSA
018update add _443._tcp.howto.zw3b.fr. 3600 IN TLSA 3 0 1 C1A68D384582BC4A88EC7DB3492678B1B6A6E088036FD90306F4F47AF5B7332D
019update del _443._tcp.radio.zw3b.fr. 3600 TLSA
020update add _443._tcp.radio.zw3b.fr. 3600 IN TLSA 3 0 1 C1A68D384582BC4A88EC7DB3492678B1B6A6E088036FD90306F4F47AF5B7332D
021update del _443._tcp.mailing.zw3b.fr. 3600 TLSA
022update add _443._tcp.mailing.zw3b.fr. 3600 IN TLSA 3 0 1 C1A68D384582BC4A88EC7DB3492678B1B6A6E088036FD90306F4F47AF5B7332D
023;
024send
025;
Retirer les numéros de lignes

Et on lance la commande, avec la clef autorisée (allow-update { key "nsupdate-key-zone"; };), pour mettre à jour notre zone DNS.

Script avec 1 ligne

001root@web:~ # nsupdate -k /root/Knsupdate-key-zone.+157+09852.private /root/nsupdate-zw3b_fr.nsupdate
Retirer les numéros de lignes

TODO : Il faut, donc "assembler tout çà" ou le faire sois-même en ligne de commande chaque fois que le certificat TLS/SSL Let's Encrypt change.


En passant dans le script : /root/acme-certif-date_verification.bash ; il faut vérifier que toutes les entitées (sous-domaine, ports, protocoles) "Suject Alt name" soient bien signées DANE et non pas seulement, sur le nom domaine domain.tld en tcp sur le port 443.

Le principe du protocole de sécurité DANE (DNS-based Authentication of Named Entities ).


Bon courage.



Salutations,
Romain