From 18051e930e7e8fa865c848a91945b427e1471b03 Mon Sep 17 00:00:00 2001 From: scriptos Date: Tue, 2 Jul 2024 22:49:30 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Alternative=20DNS=20Names=20werden=20nun=20?= =?UTF-8?q?auch=20unterst=C3=BCtzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloudpanel-autorenew-letsencrypt-certs.v1.sh | 45 +++++++++----------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/cloudpanel-autorenew-letsencrypt-certs.v1.sh b/cloudpanel-autorenew-letsencrypt-certs.v1.sh index 3ae5898..9370fee 100644 --- a/cloudpanel-autorenew-letsencrypt-certs.v1.sh +++ b/cloudpanel-autorenew-letsencrypt-certs.v1.sh @@ -5,24 +5,22 @@ # Autor: Patrick Asmus # Web: https://www.techniverse.net # Git-Reposit.: https://git.techniverse.net/scriptos/cloudpanel-autorenew-letsencrypt-certs.git -# Version: 1.4 +# Version: 1.5 # Datum: 02.07.2024 -# Modifikation: Überprüfung der Zertifikate hinzugefügt +# Modifikation: Alternative DNS Names werden nun auch unterstützt ##################################################### -# Variables +# Variablen hostname=$(hostname) config_path="/etc/nginx/sites-enabled/" log_dir="/var/log/script-logs" log_file="$log_dir/cloudpanel-letsencrypt-renew.log" -# Email Settings email_from="mail@domain.com" email_from_name="$hostname | CloudPanel Server" email_to="mail@domain.com" email_subject="Letsencrypt Zertifikate wurden auf $hostname erneuert" -# Exclude Domains days_until_expiry=14 exclude_domains="example.com other.example.com" @@ -33,40 +31,39 @@ exec 2>&1 # Funktion zur Erneuerung/Erstellung von Zertifikaten renew_certificate() { - local domain=$1 - if [[ ! $exclude_domains =~ (^|[[:space:]])$domain($|[[:space:]]) ]]; then - echo "Erneuere/Erstelle Zertifikat für: $domain" - bash /usr/bin/clpctl lets-encrypt:install:certificate --domainName=$domain - else - echo "Überspringe $domain, da es ausgeschlossen ist." - fi + local primary_domain=$1 + local subject_alternative_names=$2 + + echo "Erneuere/Erstelle Zertifikat für: $primary_domain mit alternativen Namen: $subject_alternative_names" + bash /usr/bin/clpctl lets-encrypt:install:certificate --domainName="$primary_domain" --subjectAlternativeName="$subject_alternative_names" } # Funktion zur Überprüfung des Ablaufdatums eines Zertifikats check_certificate_expiry() { - local domain=$1 - local expiry_date=$(openssl s_client -connect $domain:443 -servername $domain < /dev/null 2>/dev/null | openssl x509 -noout -dates | grep 'notAfter=' | cut -d= -f2) + local primary_domain=$1 + local all_domains=$2 + local expiry_date=$(openssl s_client -connect $primary_domain:443 -servername $primary_domain < /dev/null 2>/dev/null | openssl x509 -noout -dates | grep 'notAfter=' | cut -d= -f2) local expiry_timestamp=$(date -d "$expiry_date" +%s) local current_timestamp=$(date +%s) local days_left=$(( (expiry_timestamp - current_timestamp) / 86400 )) if [[ $days_left -lt $days_until_expiry ]]; then - echo "Das Zertifikat für $domain läuft in weniger als $days_until_expiry Tagen ab (in $days_left Tagen)." - renew_certificate $domain + echo "Das Zertifikat für $all_domains läuft in weniger als $days_until_expiry Tagen ab (in $days_left Tagen)." + renew_certificate "$primary_domain" "$all_domains" else - echo "Das Zertifikat für $domain ist noch $days_left Tage gültig. Keine Erneuerung erforderlich." + echo "Das Zertifikat für $all_domains ist noch $days_left Tage gültig. Keine Erneuerung erforderlich." fi } # Extrahiere Domains aus den Konfigurationsdateien und überprüfe Zertifikatsgültigkeit for file in $config_path*; do - domains=$(grep "server_name" $file | awk '{print $2}' | tr -d ';' | sed 's/^www\.//' | tr -d '\r') - for domain in $domains; do - if [ "$domain" != "_" ]; then - check_certificate_expiry $domain - fi - done + primary_domain=$(grep "server_name" $file | awk '{print $2}' | tr -d ';' | sed 's/^www\.//' | tr -d '\r') + all_domains=$(grep "server_name" $file | awk '{for (i=2; i<=NF; i++) print $i}' | tr -d ';' | sed 's/^www\.//' | tr -d '\r' | paste -sd "," -) + + if [ -n "$primary_domain" ]; then + check_certificate_expiry "$primary_domain" "$all_domains" + fi done # Senden einer E-Mail mit dem Logfile als Anhang -echo "Die Letsencrypt Zertifikate wurden auf $HOSTNAME überprüft und ggf. erneuert. Bitte überprüfe das angehängte Log für Details." | mail -a "$log_file" -s "$email_subject" -r "\"$email_from_name\" <$email_from>" "$email_to" +echo "Die Letsencrypt Zertifikate wurden auf $hostname überprüft und ggf. erneuert. Bitte überprüfe das angehängte Log für Details." | mail -a "$log_file" -s "$email_subject" -r "\"$email_from_name\" <$email_from>" "$email_to" -- 2.45.2 From 21b6b550b2fe28ac7abec37c98022619bcb87404 Mon Sep 17 00:00:00 2001 From: scriptos Date: Tue, 2 Jul 2024 22:51:19 +0200 Subject: [PATCH 2/2] Doku aktualisiert --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 806ccd8..9aacff0 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,15 @@ Wenn ein Zertifikat länger gültig ist, als in der Variable angegeben, sieht di `Das Zertifikat für dl.techniverse.net ist noch 88 Tage gültig. Keine Erneuerung erforderlich.` +Wenn ein Zertifikat mit einem Alternativ DNS Name verlängert / erstellt wird, sieht die Ausgabe folgend aus: + +```bash +Das Zertifikat für cloud.media-techport.de,cloud.techniverse.net läuft in weniger als 29 Tagen ab (in 27 Tagen). +Erneuere/Erstelle Zertifikat für: cloud.media-techport.de mit alternativen Namen: cloud.media-techport.de,cloud.techniverse.net +Certificate installation was successful. +``` + + ## Cronjob: Der Cronjob kann wiefolgt konfiguriert werden. -- 2.45.2