Alternative DNS Names werden nun auch unterstützt

This commit is contained in:
scriptos 2024-07-02 22:49:30 +02:00
parent 8f726c0ca1
commit 18051e930e

View File

@ -5,24 +5,22 @@
# Autor: Patrick Asmus # Autor: Patrick Asmus
# Web: https://www.techniverse.net # Web: https://www.techniverse.net
# Git-Reposit.: https://git.techniverse.net/scriptos/cloudpanel-autorenew-letsencrypt-certs.git # Git-Reposit.: https://git.techniverse.net/scriptos/cloudpanel-autorenew-letsencrypt-certs.git
# Version: 1.4 # Version: 1.5
# Datum: 02.07.2024 # Datum: 02.07.2024
# Modifikation: Überprüfung der Zertifikate hinzugefügt # Modifikation: Alternative DNS Names werden nun auch unterstützt
##################################################### #####################################################
# Variables # Variablen
hostname=$(hostname) hostname=$(hostname)
config_path="/etc/nginx/sites-enabled/" config_path="/etc/nginx/sites-enabled/"
log_dir="/var/log/script-logs" log_dir="/var/log/script-logs"
log_file="$log_dir/cloudpanel-letsencrypt-renew.log" log_file="$log_dir/cloudpanel-letsencrypt-renew.log"
# Email Settings
email_from="mail@domain.com" email_from="mail@domain.com"
email_from_name="$hostname | CloudPanel Server" email_from_name="$hostname | CloudPanel Server"
email_to="mail@domain.com" email_to="mail@domain.com"
email_subject="Letsencrypt Zertifikate wurden auf $hostname erneuert" email_subject="Letsencrypt Zertifikate wurden auf $hostname erneuert"
# Exclude Domains
days_until_expiry=14 days_until_expiry=14
exclude_domains="example.com other.example.com" exclude_domains="example.com other.example.com"
@ -33,40 +31,39 @@ exec 2>&1
# Funktion zur Erneuerung/Erstellung von Zertifikaten # Funktion zur Erneuerung/Erstellung von Zertifikaten
renew_certificate() { renew_certificate() {
local domain=$1 local primary_domain=$1
if [[ ! $exclude_domains =~ (^|[[:space:]])$domain($|[[:space:]]) ]]; then local subject_alternative_names=$2
echo "Erneuere/Erstelle Zertifikat für: $domain"
bash /usr/bin/clpctl lets-encrypt:install:certificate --domainName=$domain echo "Erneuere/Erstelle Zertifikat für: $primary_domain mit alternativen Namen: $subject_alternative_names"
else bash /usr/bin/clpctl lets-encrypt:install:certificate --domainName="$primary_domain" --subjectAlternativeName="$subject_alternative_names"
echo "Überspringe $domain, da es ausgeschlossen ist."
fi
} }
# Funktion zur Überprüfung des Ablaufdatums eines Zertifikats # Funktion zur Überprüfung des Ablaufdatums eines Zertifikats
check_certificate_expiry() { check_certificate_expiry() {
local domain=$1 local primary_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 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 expiry_timestamp=$(date -d "$expiry_date" +%s)
local current_timestamp=$(date +%s) local current_timestamp=$(date +%s)
local days_left=$(( (expiry_timestamp - current_timestamp) / 86400 )) local days_left=$(( (expiry_timestamp - current_timestamp) / 86400 ))
if [[ $days_left -lt $days_until_expiry ]]; then 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)." echo "Das Zertifikat für $all_domains läuft in weniger als $days_until_expiry Tagen ab (in $days_left Tagen)."
renew_certificate $domain renew_certificate "$primary_domain" "$all_domains"
else 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 fi
} }
# Extrahiere Domains aus den Konfigurationsdateien und überprüfe Zertifikatsgültigkeit # Extrahiere Domains aus den Konfigurationsdateien und überprüfe Zertifikatsgültigkeit
for file in $config_path*; do for file in $config_path*; do
domains=$(grep "server_name" $file | awk '{print $2}' | tr -d ';' | sed 's/^www\.//' | tr -d '\r') primary_domain=$(grep "server_name" $file | awk '{print $2}' | tr -d ';' | sed 's/^www\.//' | tr -d '\r')
for domain in $domains; do 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 [ "$domain" != "_" ]; then
check_certificate_expiry $domain if [ -n "$primary_domain" ]; then
fi check_certificate_expiry "$primary_domain" "$all_domains"
done fi
done done
# Senden einer E-Mail mit dem Logfile als Anhang # 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"