Compare commits
12 Commits
9fef31b78e
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2a8c9814fc | |||
| e6996ec664 | |||
| 0ae9c04770 | |||
|
|
21b6b550b2 | ||
|
|
18051e930e | ||
| 8f726c0ca1 | |||
| 4fa3e66aa9 | |||
| a903babbfe | |||
| 325df1a556 | |||
|
|
6eddcbdc27 | ||
| 4891da72b0 | |||
|
|
29a11ba524 |
98
README.md
98
README.md
@@ -1,50 +1,124 @@
|
||||
# Autorenew der Letsencrypt Zertifikate mit CloudPanel
|
||||
|
||||
|
||||
## Was macht dieses Script?
|
||||
|
||||
Das Skript `cloudpanel-autorenew-letsencrypt-certs.v1.sh` automatisiert die Erneuerung und Installation von Let's Encrypt-Zertifikaten für alle Domains und Subdomains, die auf einem CloudPanel-Server konfiguriert sind. Es durchsucht die Nginx-Konfigurationsdateien im Verzeichnis `/etc/nginx/sites-enabled/` nach Domain-Namen, extrahiert diese und führt für jede gefundene Domain 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.
|
||||
Dieses Script prüft im ersten Schritt, wie lange das Zertifikat der angegeben Domain noch gültig ist.
|
||||
Wenn die Gültigkeit einen Wert in Tagen unterschreitet, welcher in der Variable `days_until_expiry=` angegebenen wurde, wird ein neues LetsEncrypt Zertifikat für besagte Domain erstellt.
|
||||
Der Wert ist mit 14 Tagen voreingestellt und kann nach belieben verändert werden.
|
||||
|
||||
## Wie wird das Zertifikat erzeugt?
|
||||
|
||||
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.
|
||||
|
||||
## Feature: Domains ausschließen
|
||||
|
||||
Domains können jetzt ausgeschlossen werden.
|
||||
Das kann ganz einfach geschehen, in dem die auszuschließenden Domains in der Variable `exclude_domains=` gepflegt werden.
|
||||
|
||||
Dazu einfach die Variable `exclude_domains` pflegen.
|
||||
**Ein Beispiel:**
|
||||
|
||||
Domains werden mit Leerzeichen getrennt: `exclude_domains="example.com other.example.com"`
|
||||
`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.
|
||||
Domains müssen immer durch Leerzeichen getrennt werden.
|
||||
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.
|
||||
|
||||
Wird diese Variable nicht gepflegt, werden alle Domains erneuert.
|
||||
|
||||
## Ausführung:
|
||||
|
||||
1. **Klonen des Repositorys**
|
||||
|
||||
`git clone https://git.techniverse.net/scriptos/cloudpanel-autorenew-letsencrypt-certs.git`
|
||||
|
||||
|
||||
2. **Email Settings im Script anpassen**
|
||||
|
||||
Folgende Variablen stehen zur Auswahl:
|
||||
```
|
||||
Folgende Variablen stehen zur Auswahl, wenn der Emailversand genutzt werden soll:
|
||||
```bash
|
||||
email_from="mail@domain.com"
|
||||
email_from_name="$hostname | CloudPanel Server"
|
||||
email_to="mail@domain.com"
|
||||
email_subject="Letsencrypt Zertifikate wurden auf $HOSTNAME erneuert"
|
||||
```
|
||||
|
||||
|
||||
3. **Ausführen des Scripts**
|
||||
`bash cloudpanel-autorenew-letsencrypt-certs.v1.sh`
|
||||
|
||||
Die Ausgabe sollte folgendermaßen aussehen:
|
||||
```bash
|
||||
bash cloudpanel-autorenew-letsencrypt-certs.v1.sh
|
||||
```
|
||||
|
||||

|
||||
Die Ausgabe sieht folgendermaßen aus:
|
||||
|
||||
```bash
|
||||
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
|
||||
Certificate installation was successful.
|
||||
```
|
||||
|
||||
Wenn eine Domain übersprungen wird, sieht die Ausgabe folgendermaßen aus:
|
||||
|
||||
`Überspringe example.domain.com, 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:
|
||||
|
||||
```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:
|
||||
|
||||
Der Cronjob kann wiefolgt konfiguriert werden.
|
||||
Ich für meinen Teil lasse dieses Script einmal im Monat laufen.
|
||||
|
||||
1. Aufrufen des Crontabs
|
||||
`crontab -e`
|
||||
|
||||
2. Konfiguration Cronjob
|
||||
`@monthly bash /home/scripts/default/cloudpanel-autorenew-letsencrypt-certs.v1.sh >/dev/null 2>&1`
|
||||
`@daily bash /home/scripts/default/cloudpanel-autorenew-letsencrypt-certs.v1.sh >/dev/null 2>&1`
|
||||
|
||||
<p align="center">
|
||||
<img src="https://assets.techniverse.net/f1/git/graphics/gray0-catonline.svg" alt="">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<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>
|
||||
@@ -5,24 +5,23 @@
|
||||
# Autor: Patrick Asmus
|
||||
# Web: https://www.techniverse.net
|
||||
# Git-Reposit.: https://git.techniverse.net/scriptos/cloudpanel-autorenew-letsencrypt-certs.git
|
||||
# Version: 1.3
|
||||
# Datum: 20.05.2024
|
||||
# Modifikation: Domains können nun von der Zertifikatenerneuerung ausgeschlossen werden
|
||||
# Version: 1.5
|
||||
# Datum: 02.07.2024
|
||||
# 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"
|
||||
email_subject="Letsencrypt Zertifikate wurden auf $hostname erneuert"
|
||||
|
||||
# Exclude Domains
|
||||
days_until_expiry=14
|
||||
exclude_domains="example.com other.example.com"
|
||||
|
||||
# Leite die Ausgaben in das Log-File um
|
||||
@@ -32,24 +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
|
||||
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 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 $all_domains läuft in weniger als $days_until_expiry Tagen ab (in $days_left Tagen)."
|
||||
renew_certificate "$primary_domain" "$all_domains"
|
||||
else
|
||||
echo "Überspringe $domain, da es ausgeschlossen ist."
|
||||
echo "Das Zertifikat für $all_domains ist noch $days_left Tage gültig. Keine Erneuerung erforderlich."
|
||||
fi
|
||||
}
|
||||
|
||||
# Extrahiere Domains aus den Konfigurationsdateien und führe Zertifikatserneuerung aus
|
||||
# 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
|
||||
renew_certificate $domain
|
||||
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
|
||||
done
|
||||
|
||||
# Senden einer E-Mail mit dem Logfile als Anhang
|
||||
echo "Die Letsencrypt Zertifikate wurden auf $HOSTNAME 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"
|
||||
|
||||
Reference in New Issue
Block a user