Compare commits

..

8 Commits

Author SHA1 Message Date
2a8c9814fc Doku ergänzt 2024-07-02 21:04:44 +00:00
e6996ec664 README.md aktualisiert 2024-07-02 20:58:51 +00:00
0ae9c04770 Merge pull request 'servernames-maerge' (#3) from servernames-maerge into main
Reviewed-on: #3
2024-07-02 20:51:39 +00:00
scriptos
21b6b550b2 Doku aktualisiert 2024-07-02 22:51:19 +02:00
scriptos
18051e930e Alternative DNS Names werden nun auch unterstützt 2024-07-02 22:49:30 +02:00
8f726c0ca1 README.md aktualisiert 2024-07-02 19:44:46 +00:00
4fa3e66aa9 README.md aktualisiert 2024-07-02 19:42:49 +00:00
a903babbfe Doku überarbeitet 2024-07-02 19:41:08 +00:00
2 changed files with 73 additions and 32 deletions

View File

@@ -1,4 +1,3 @@
# Autorenew der Letsencrypt Zertifikate mit CloudPanel # Autorenew der Letsencrypt Zertifikate mit CloudPanel
@@ -12,7 +11,7 @@ Der Wert ist mit 14 Tagen voreingestellt und kann nach belieben verändert werde
Es durchsucht die Nginx-Konfigurationsdateien im Verzeichnis `/etc/nginx/sites-enabled/` nach dem Domain-Namen, extrahiert diesen und führt den Befehl `clpctl lets-encrypt:install:certificate` aus, um das entsprechende SSL-Zertifikat zu erneuern oder zu installieren. Das Skript protokolliert alle seine Aktivitäten in eine Log-Datei, die im Verzeichnis `/var/log/script-logs` gespeichert wird. Es durchsucht die Nginx-Konfigurationsdateien im Verzeichnis `/etc/nginx/sites-enabled/` nach dem Domain-Namen, extrahiert diesen und führt den Befehl `clpctl lets-encrypt:install:certificate` aus, um das entsprechende SSL-Zertifikat zu erneuern oder zu installieren. Das Skript protokolliert alle seine Aktivitäten in eine Log-Datei, die im Verzeichnis `/var/log/script-logs` gespeichert wird.
## Features dieses Scriptes: ## Feature: Domains ausschließen
Domains können jetzt ausgeschlossen werden. Domains können jetzt ausgeschlossen werden.
Das kann ganz einfach geschehen, in dem die auszuschließenden Domains in der Variable `exclude_domains=` gepflegt werden. Das kann ganz einfach geschehen, in dem die auszuschließenden Domains in der Variable `exclude_domains=` gepflegt werden.
@@ -20,18 +19,47 @@ Das kann ganz einfach geschehen, in dem die auszuschließenden Domains in der Va
**Ein Beispiel:** **Ein Beispiel:**
`exclude_domains="git.techniverse.net techniverse.net"` `exclude_domains="git.techniverse.net techniverse.net"`
In diesem Beispiel werden die Domains (Subdomains) `git.techniverse.net` und `techniverse.net` vom verlängern bzw. erstellen der LetzEncrypt Zertifikate ausgeschlossen. In diesem Beispiel werden die Domains (Subdomains) `git.techniverse.net` und `techniverse.net` vom verlängern bzw. erstellen der LetzEncrypt Zertifikate ausgeschlossen.
Domains müssen immer durch Leerzeichen getrennt werden. Domains müssen immer durch Leerzeichen getrennt werden.
Sollen keine Domains ausgeschlossen werden, reicht es, die Variable leer zu lassen: `exclude_domains=""` Sollen keine Domains ausgeschlossen werden, reicht es, die Variable leer zu lassen: `exclude_domains=""`
## Feature: Alternative DNS Names berücksichtigen
Alternative DNS Names werden jetzt ebenfalls unterstützt.
Die einzige Voraussetzung ist, dass in der Vhost Konfiguration der Alternative DNS Name nach dem eigentlichen DNS Namen angegeben wird.
**Ein Beispiel:**
Ich habe eine Site erstellt. Dabei habe ich die Domain `cloud.media-techport.de` angegeben.
In der Vhost Konfiguration ist dieser an erster Stelle gepflegt:
```yaml
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
{{ssl_certificate_key}}
{{ssl_certificate}}
server_name cloud.media-techport.de cloud.techniverse.net;
{{root}}
```
An zweiter Stelle habe ich den alternativen DNS Name gepflegt. In meinem Fall `cloud.techniverse.net`
Mehr müsst ihr nicht tun. Das Script wird dies berücksichtigen.
## Ausführung: ## Ausführung:
1. **Klonen des Repositorys** 1. **Klonen des Repositorys**
`git clone https://git.techniverse.net/scriptos/cloudpanel-autorenew-letsencrypt-certs.git` `git clone https://git.techniverse.net/scriptos/cloudpanel-autorenew-letsencrypt-certs.git`
3. **Email Settings im Script anpassen**
2. **Email Settings im Script anpassen**
Folgende Variablen stehen zur Auswahl, wenn der Emailversand genutzt werden soll: Folgende Variablen stehen zur Auswahl, wenn der Emailversand genutzt werden soll:
```bash ```bash
@@ -42,11 +70,14 @@ email_subject="Letsencrypt Zertifikate wurden auf $HOSTNAME erneuert"
``` ```
4. **Ausführen des Scripts** 3. **Ausführen des Scripts**
`bash cloudpanel-autorenew-letsencrypt-certs.v1.sh` ```bash
bash cloudpanel-autorenew-letsencrypt-certs.v1.sh
```
Die Ausgabe sieht folgendermaßen aus: Die Ausgabe sieht folgendermaßen aus:
```bash ```bash
Das Zertifikat für cloud.media-techport.de läuft in weniger als 59 Tagen ab (in 58 Tagen). Das Zertifikat für cloud.media-techport.de läuft in weniger als 59 Tagen ab (in 58 Tagen).
Erneuere/Erstelle Zertifikat für: cloud.media-techport.de Erneuere/Erstelle Zertifikat für: cloud.media-techport.de
@@ -55,11 +86,24 @@ Certificate installation was successful.
Wenn eine Domain übersprungen wird, sieht die Ausgabe folgendermaßen aus: Wenn eine Domain übersprungen wird, sieht die Ausgabe folgendermaßen aus:
`Überspringe techniverse.net, da es ausgeschlossen ist.` ```bash
Überspringe techniverse.net, da es ausgeschlossen ist.
```
Wenn ein Zertifikat länger gültig ist, als in der Variable angegeben, sieht die Ausgabe folgendermaßen aus: Wenn ein Zertifikat länger gültig ist, als in der Variable angegeben, sieht die Ausgabe folgendermaßen aus:
`Das Zertifikat für dl.techniverse.net ist noch 88 Tage gültig. Keine Erneuerung erforderlich.` ```bash
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: ## Cronjob:
@@ -76,5 +120,5 @@ Der Cronjob kann wiefolgt konfiguriert werden.
</p> </p>
<p align="center"> <p align="center">
<img src="https://assets.techniverse.net/f1/logos/small/license.png" alt="License" width="15" height="15"> <a href="./template_repository/src/branch/main/LICENSE">License</a> | <img src="https://assets.techniverse.net/f1/logos/small/matrix2.svg" alt="Matrix" width="15" height="15"> <a href="https://matrix.to/#/#community:techniverse.net">Matrix</a> | <img src="https://assets.techniverse.net/f1/logos/small/mastodon2.svg" alt="Matrix" width="15" height="15"> <a href="https://social.techniverse.net/@donnerwolke">Mastodon</a> <img src="https://assets.techniverse.net/f1/logos/small/license.png" alt="License" width="15" height="15"> <a href="./cloudpanel-autorenew-letsencrypt-certs/src/branch/main/LICENSE">License</a> | <img src="https://assets.techniverse.net/f1/logos/small/matrix2.svg" alt="Matrix" width="15" height="15"> <a href="https://matrix.to/#/#community:techniverse.net">Matrix</a> | <img src="https://assets.techniverse.net/f1/logos/small/mastodon2.svg" alt="Matrix" width="15" height="15"> <a href="https://social.techniverse.net/@donnerwolke">Mastodon</a>
</p> </p>

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
check_certificate_expiry "$primary_domain" "$all_domains"
fi fi
done
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"