Nextcloud und acme.sh - automatische Aktualisierung von SSL-Zertifikaten für deine Nextcloud
Die Aktualisierung von Let's Encrypt Zertifikaten lässt sich mit acme.sh
automatisieren. In diesem Artikel wird für eine bestehende Nextcloud der Prozess von Certbot
auf acme.sh
umgestellt.
Es wird dafür die Hetzner DNS Console und die ACME Challenge verwendet.
Nextcloud - Der ultimative Installations- und Recovery-Guide 🦸♂️
Dein Weg zur eigenen Nextcloud 👍
1. Das Ziel 🏁
Die eigene Nextcloud läuft auf einem Raspberry Pi im eigenen Netzwerk (1).
Der Nextcloud - Der ultimative Installations- und Recovery-Guide 🦸♂️ auf codeberg.org.
Der Zugriff darauf erfolgt nur mit bekannten Geräten innerhalb des eigenen LANs. Geräte von außerhalb werden über einen WireGuard-VPN eingebunden.
Es wird dafür die VPN-Funktion der FRITZ!Box verwendet.
Raspberry Pi & Betriebssystem
Als Server für die Nextcloud wird ein Raspberry Pi 4 mit Debian Bookworm verwendet:
----------[ Raspberry Pi Hardware ]----------
Raspberry Pi 4 Model B Rev 1.5
Hardware Platform
aarch64
Version Level
#1 SMP PREEMPT Debian 1:6.6.74-1+rpt1 (2025-01-27)
----------[ Raspberry Pi OS Informationen ]----------
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
Release Level Of The Operating System
6.6.74+rpt-rpi-v8
Keine Portweiterleitung - Ein Port auf dem Router nach außen wird NICHT geöffnet.
Eigene SSL-Zertifikate - Ein gültiges SSL-Zertifikat wird benötigt, damit sich alle Clients (im LAN und VPN) problemlos an der Nextcloud anmelden können und die Verbindung gesichert ist.
Local DNS-Eintrag - Im eigenen Netzwerk läuft ein Pi-hole. Dort ist ein Local DNS
-Eintrag (1) gesetzt, damit alle Anfragen nach next.example.com
sofort an den Raspberry Pi mit der Nextcloud gesendet werden. Der Umweg über das WWW ist damit nicht notwendig.
Der Nextcloud - Der ultimative Installations- und Recovery-Guide 🦸♂️ auf codeberg.org.
Domain Hoster
Es gibt viele Anbieter, die wie Hetzner, die ACME-Challenge anbieten. Im Abschnitt DNS-Anbieter konfigurieren wird darauf verweisen.
Vor einem Wechsel des Hosters, erst einmal in Ruhe schauen, ob der eigenen Anbieter nicht bereits unterstütz wird. 😀
Let's Encrypt verwendet seit einiger Zeit E-Mail, dass die automatische E-Mail-Erinnerung eingestellt wird. Der Grund, es ist zu teuer die Infrastruktur vorzuhalten, um die Nachrichten zu versenden.
Let's Encrypt Expiration Emails Update
Hi,
As a Let’s Encrypt Subscriber, you benefit from access to free, automated TLS certificates. One way we have supported Subscribers is by sending expiration notification emails when it’s time to renew a certificate.
We’re writing to inform you that we intend to discontinue sending expiration notification emails. You can learn more in this blog post:
https://letsencrypt.org/2025/01/22/Ending-Expiration-Emails
Here are some actions you can take today:
Automate with an ACME Client that supports Automated Renewal Information (ARI). ARI enables us to automatically renew your certificates ahead of schedule should the need arise:
https://letsencrypt.org/2024/04/25/guide-to-integrating-ari-into-existing-acme-clients
Sign up for a third-party monitoring service that may provide expiration emails. We can recommend Red Sift Certificates Lite, which provides free expiration emails for up to 250 active certificates:
https://redsift.com/pulse-platform/certificates-lite
Opt in to emails. While we are deprecating expiration notification emails, you can opt in to continue to receive other emails. We’ll keep you informed about technical updates, and other news about Let’s Encrypt and our parent nonprofit, ISRG, based on the preferences you choose:
https://letsencrypt.org/opt-in/
All the best, Let’s Encrypt
Für meine Nextcloud-Installation habe ich bisher Certbot
mit der HTTP-01 challenge
verwendet. Die Aktualisierung wurde manuell, nach der Erinnerungsnachricht von mir durchgeführt.
Nun hatte ich einen guten Grund den Prozess zu automatisieren und auf die DNS-01 challenge
umzustellen.7
2. Hetzner DNS Console
Die Hetzner DNS Console unterstützt die ACME Challenge über eine API und kann kostenfrei genutzt werden. Nach einer Anmeldung steht das Tool sofort zur Verfügung und kann verwendet werden.
Kein Domain Hosting mit der Hetzner DNS Console
Die DNS Console
bietet keine Möglichkeit eine Domain (1) zu hosten.
Die eigene Domain kann bei Hetzner gehostet werden, dafür ist aber ein weiteres kostenpflichtiges Paket zu buchen.
Es kann natürlich auch ein anderer Domainhoster genutzt werden, aber es muss eine Umleitung eingerichtet werden, damit die DNS-Server von Hetzner verwendet werden.
Domain in diesem Beispiel ist
example.com
.Für die Nextcloud wird die Sub-Domain
next.example.com
verwendet.
In diesem Beispiel liegt die Domain bereits bei Hetzner und weitere Einstellungen sind nicht mehr erforderlich.4
Es muss für acme.sh
lediglich ein neuer Token erstellt werden.
Hetzner DNS Console funktioniert out-of-the-box
Die Hetzner eigenen Nameserver sind bereits konfiguriert.
Ein neuer, eigener Eintrag für next.example.com
muss nicht erstellt werden.
Das wird später alles von acme.sh
erledigt.
3. Domain Hosting
Wird die Domain von einem anderen Anbieter verwaltet, muss eine Weiterleitung auf die Hetzner DNS Console eingestellt werden. Dazu werden normalerweise entsprechende Anleitungen vom eigenen Anbieter bereitgestellt.
Wird ein Mail-Paket bei einem anderen Anbieter genutzt, dann ist unbedingt um voraus abzuklären, wie es sich mit den MX-Einträgen verhält. Werden die Nameserver von Hetzner eingetragen, werden ggf. die MX-Einträge überschrieben und die E-Mails laden bei Hetzner. Dort können die Nachrichten aber nicht verarbeitet werden und gehen verloren.
Die Nameservereinstellungen können mit den Befehlen dig
und nslookup
geprüft werden.
4. acme.sh
Die automatische Installation von SSL-Zertifikaten auf Webservern durch acme.sh
funktioniert auf der Grundlage von vordefinierten Webserver-Plugins, die mit dem Skript ausgeliefert werden. Diese Plugins ermöglichen es acme.sh
, das SSL-Zertifikat direkt auf gängigen Webservern wie Apache oder Nginx zu installieren, nachdem das Zertifikat erfolgreich ausgestellt wurde.1
4.1. acme.sh installieren
Es wird empfohlen einen eigenen Benutzer oder ROOT
für die Verwendung von acme.sh
zu verwenden. Der Benutzer benötigt Rechte, um das aktualisierte Zertifikat in das Verzeichnis zu schreiben und den Webserver neu zu starten.
In dieser Anleitung wird der Benutzer ROOT
verwendet. In der sshd_config
wurde eingestellt, dass ROOT
sich nicht remote am Server anmelden kann. Die Anmeldung ist nur für Mitglieder einer bestimmten Gruppe zulässig und es darf kein Passwort, sondern nur ein SSH-Schlüssel verwendet werden.2
Man meldet sich wie gewohnt mit dem eigenen Benutzer am Server an und wechselt dann zum Benutzer ROOT
.
sudo su
~: whoami
root
Die Installation erfolgt mit curl
. acme.sh
wird in das Verzeichnis /root/.acme.sh/
installiert.
root@nextcloud:/home/user# curl https://get.acme.sh | sh -s email=mail@example.com
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1032 0 1032 0 0 2745 0 --:--:-- --:--:-- --:--:-- 2752
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 220k 100 220k 0 0 1165k 0 --:--:-- --:--:-- --:--:-- 1169k
[Mi 26 Mär 2025 18:45:35 CET] Installing from online archive.
[Mi 26 Mär 2025 18:45:35 CET] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[Mi 26 Mär 2025 18:45:35 CET] Extracting master.tar.gz
[Mi 26 Mär 2025 18:45:36 CET] Installing to /root/.acme.sh
[Mi 26 Mär 2025 18:45:36 CET] Installed to /root/.acme.sh/acme.sh
[Mi 26 Mär 2025 18:45:36 CET] Installing alias to '/root/.bashrc'
[Mi 26 Mär 2025 18:45:36 CET] Close and reopen your terminal to start using acme.sh
[Mi 26 Mär 2025 18:45:36 CET] Installing cron job
[Mi 26 Mär 2025 18:45:36 CET] bash has been found. Changing the shebang to use bash as preferred.
[Mi 26 Mär 2025 18:45:37 CET] OK
[Mi 26 Mär 2025 18:45:37 CET] Install success
Die Installation für einen normalen Benutzer erfolgt man am Einfachstem mit Git.
Es wird das aktuelle Git-Repository auf den eigenen Server geklont und ausgeführt.
git clone https://github.com/acmesh-official/acme.sh.git
cd ~/acme.sh
./acme.sh --install -m mail@example.com
Nach der Installation wird im Verzeichnis des aktuellen Benutzers der Ordner ~/.acme.sh
angelegt. In der Datei account.conf
wird z.B. die E-Mail-Adresse abgespeichert.
cd ~/.acme.sh
Terminal neu starten
In beiden Fällen sollte nach erfolgreicher Installation das Terminal, alternativ auch der Server, einmal neu gestartet werden.
4.2. acme.sh deinstallieren
acme.sh
lässt sich für alle bisherigen Benutzer 👤 komplett deinstallieren. Dazu wird einfach der --uninstall
-Befehl verwendet.
acme.sh --uninstall
[Mi 26 Mär 2025 18:45:02 CET] Removing cron job
[Mi 26 Mär 2025 18:45:02 CET] LE_WORKING_DIR='/home/user/.acme.sh'
[Mi 26 Mär 2025 18:45:02 CET] Uninstalling alias from: '/home/user/.bashrc'
[Mi 26 Mär 2025 18:45:02 CET] The keys and certs are in "/home/user/.acme.sh". You can remove them by yourself.
Die beiden Ordner /home/user/acme.sh
und /home/user/.acme.sh/
bleiben von der Löschung unberührt. Es werden die Links in bashrc
entfernt, damit acme.sh
nicht mehr aufgerufen werden kann. Ebenso wird der CRON für den aktuellen Benutzer 👤 entfernt.
Beide Verzeichnisse können gelöscht werden. Wurden bisher Zertifikate geholt, verbleiben diese im Verzeichnis /home/user/.acme.sh/
und können weiter verwendet oder gelöscht werden.
5. DNS-Anbieter konfigurieren
Es sind bereits einige DNS-Anbieter zur Verwendung mit acme.sh
vorkonfiguriert. Die Liste lässt sich auf unterschiedliche Arten einsehen:
- Liste auf GitHub https://github.com/acmesh-official/acme.sh/tree/master/dnsapi
- Wiki https://github.com/acmesh-official/acme.sh/wiki/dnsapi
Ebenso kann die Liste direkt im frisch geklonten Repository auf dem eigenen Server eingesehen werden.
sudo su
root@nextcloud:/home/user# whoami
root
ls /root/.acme.sh/dnsapi/
cat dns_hetzner.sh
Am Anfang der Datei dns_hetzner.sh
steht gleich der Variablenname HETZNER_Token API Token
. (Je nach verwendetem DNS-Anbieter unterscheidet sich der Name der Variable.)
Mit dem Ausführen des Befehls wird der eigene API-Token verwendet.
export HETZNER_Token="<your-token>"
ls ~/acme.sh/dnsapi/
cat dns_hetzner.sh
Am Anfang der Datei dns_hetzner.sh
steht gleich der Variablenname HETZNER_Token API Token
. (Je nach verwendetem DNS-Anbieter unterscheidet sich der Name der Variable.)
Mit dem Ausführen des Befehls wird der eigene API-Token verwendet.
export HETZNER_Token="<your-token>"
Die Vorbereitungen sind abgeschlossen und das Zertifikat kann erstellt werden.
6. Zertifikat erstellen
Dieser Befehl beantragt ein Zertifikat für next.example.com
mit der DNS-01-Validierung über den Hetzner-DNS-Provider.3
bash
./acme.sh --issue --dns dns_hetzner -d next.example.com
Es wird sofort das neue Zertifikat auf den Server geholt:
root@nextcloud:~/.acme.sh# ./acme.sh --issue --dns dns_hetzner -d next.example.com
[Mi 26 Mär 2025 18:44:28 CET] Using CA: https://acme.zerossl.com/v2/DV90
[Mi 26 Mär 2025 18:44:28 CET] Account key creation OK.
[Mi 26 Mär 2025 18:44:28 CET] No EAB credentials found for ZeroSSL, let's obtain them
[Mi 26 Mär 2025 18:44:29 CET] Registering account: https://acme.zerossl.com/v2/DV90
[Mi 26 Mär 2025 18:44:31 CET] Registered
[Mi 26 Mär 2025 18:44:31 CET] ACCOUNT_THUMBPRINT='xxxxxxxxxxxxxxxxxxxxxx'
[Mi 26 Mär 2025 18:44:31 CET] Creating domain key
[Mi 26 Mär 2025 18:44:31 CET] The domain key is here: /root/.acme.sh/next.example.com_ecc/next.example.com.key
[Mi 26 Mär 2025 18:44:31 CET] Single domain='next.example.com'
[Mi 26 Mär 2025 18:44:34 CET] Getting webroot for domain='next.example.com'
[Mi 26 Mär 2025 18:44:34 CET] Adding TXT value: xxxxxxxxxxxxxxxxxxxxxx for domain: _acme-challenge.next.example.com
[Mi 26 Mär 2025 18:44:35 CET] Adding record
[Mi 26 Mär 2025 18:44:36 CET] Record added, OK
[Mi 26 Mär 2025 18:44:39 CET] The TXT record has been successfully added.
[Mi 26 Mär 2025 18:44:39 CET] Let's check each DNS record now. Sleeping for 20 seconds first.
[Mi 26 Mär 2025 18:45::00 CET] You can use '--dnssleep' to disable public dns checks.
[Mi 26 Mär 2025 18:45::00 CET] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Mi 26 Mär 2025 18:45::00 CET] Checking next.example.com for _acme-challenge.next.example.com
[Mi 26 Mär 2025 18:45::01 CET] Success for domain next.example.com '_acme-challenge.next.example.com'.
[Mi 26 Mär 2025 18:45::01 CET] All checks succeeded
[Mi 26 Mär 2025 18:45::01 CET] Verifying: next.example.com
[Mi 26 Mär 2025 18:45::02 CET] Processing. The CA is processing your order, please wait. (1/30)
[Mi 26 Mär 2025 18:45::06 CET] Success
[Mi 26 Mär 2025 18:45::06 CET] Removing DNS records.
[Mi 26 Mär 2025 18:45::06 CET] Removing txt: xxxxxxxxxxxxxxxxxxxxxx for domain: _acme-challenge.next.example.com
[Mi 26 Mär 2025 18:45::11 CET] Record deleted
[Mi 26 Mär 2025 18:45::11 CET] Successfully removed
[Mi 26 Mär 2025 18:45::11 CET] Verification finished, beginning signing.
[Mi 26 Mär 2025 18:45::11 CET] Let's finalize the order.
[Mi 26 Mär 2025 18:45::11 CET] Le_OrderFinalize='https://acme.zerossl.com/v2/DV90/order/I7-cx-aD485bm8IRWRJ-4g/finalize'
[Mi 26 Mär 2025 18:45::12 CET] Order status is 'processing', let's sleep and retry.
[Mi 26 Mär 2025 18:45::12 CET] Sleeping for 15 seconds then retrying
[Mi 26 Mär 2025 18:45::28 CET] Polling order status: https://acme.zerossl.com/v2/DV90/order/I7-cx-aD485bm8IRWRJ-4g
[Mi 26 Mär 2025 18:45::29 CET] Downloading cert.
[Mi 26 Mär 2025 18:45::29 CET] Le_LinkCert='https://acme.zerossl.com/v2/DV90/cert/oOQWV67bdxmZ4eDNWOBErw'
[Mi 26 Mär 2025 18:45::30 CET] Cert success.
-----BEGIN CERTIFICATE-----
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
444444444444444444444444444444==
-----END CERTIFICATE-----
[Mi 26 Mär 2025 18:45::30 CET] Your cert is in: /root/.acme.sh/next.example.com_ecc/next.example.com.cer
[Mi 26 Mär 2025 18:45::30 CET] Your cert key is in: /root/.acme.sh/next.example.com_ecc/next.example.com.key
[Mi 26 Mär 2025 18:45::30 CET] The intermediate CA cert is in: /root/.acme.sh/next.example.com_ecc/ca.cer
[Mi 26 Mär 2025 18:45::30 CET] And the full-chain cert is in: /root/.acme.sh/next.example.com_ecc/fullchain.cer
Die Zertifikatsdateien wurden auf dem eigenen Server im Verzeichnis /root/.acme.sh/next.example.com_ecc/
abgespeichert.
Ein Blick in den Ordner zeigt die Dateien:
ls -lah
insgesamt 40K
drwxr-xr-x 2 root root 4.0K 26. Mär 19:45 .
drwx------ 7 root root 4.0K 26. Mär 19:45 ..
-rw-r--r-- 1 root root 2.7K 26. Mär 19:45 ca.cer
-rw-r--r-- 1 root root 4.1K 26. Mär 19:45 fullchain.cer
-rw-r--r-- 1 root root 1.5K 26. Mär 19:45 next.example.com.cer
-rw-r--r-- 1 root root 625 26. Mär 19:45 next.example.com.conf
-rw-r--r-- 1 root root 469 26. Mär 19:45 next.example.com.csr
-rw-r--r-- 1 root root 188 26. Mär 19:45 next.example.com.csr.conf
-rw------- 1 root root 227 26. Mär 19:45 next.example.com.key
cd ~/acme.sh
./acme.sh --issue --dns dns_hetzner -d next.example.com
Es wird sofort das neue Zertifikat auf den Server geholt:
[Mi 26 Mär 2025 18:44:16 CET] Using CA: https://acme.zerossl.com/v2/DV90
[Mi 26 Mär 2025 18:44:16 CET] Account key creation OK.
[Mi 26 Mär 2025 18:44:16 CET] No EAB credentials found for ZeroSSL, let's obtain them
[Mi 26 Mär 2025 18:44:17 CET] Registering account: https://acme.zerossl.com/v2/DV90
[Mi 26 Mär 2025 18:44:19 CET] Registered
[Mi 26 Mär 2025 18:44:19 CET] ACCOUNT_THUMBPRINT='xxxxxxxxxxxxxxxxxxxxxx'
[Mi 26 Mär 2025 18:44:19 CET] Creating domain key
[Mi 26 Mär 2025 18:44:19 CET] The domain key is here: /home/user/.acme.sh/next.example.com_ecc/next.example.com.key
[Mi 26 Mär 2025 18:44:19 CET] Single domain='next.example.com'
[Mi 26 Mär 2025 18:44:21 CET] Getting webroot for domain='next.example.com'
[Mi 26 Mär 2025 18:44:21 CET] Adding TXT value: NYgFoj-xxxxxxxxxxxxxxxxxxxxxx for domain: _acme-challenge.next.example.com
[Mi 26 Mär 2025 18:44:22 CET] Adding record
[Mi 26 Mär 2025 18:44:23 CET] Record added, OK
[Mi 26 Mär 2025 18:44:26 CET] The TXT record has been successfully added.
[Mi 26 Mär 2025 18:44:26 CET] Let's check each DNS record now. Sleeping for 20 seconds first.
[Mi 26 Mär 2025 18:44:47 CET] You can use '--dnssleep' to disable public dns checks.
[Mi 26 Mär 2025 18:44:47 CET] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Mi 26 Mär 2025 18:44:47 CET] Checking next.example.com for _acme-challenge.next.example.com
[Mi 26 Mär 2025 18:44:49 CET] Success for domain next.example.com '_acme-challenge.next.example.com'.
[Mi 26 Mär 2025 18:44:49 CET] All checks succeeded
[Mi 26 Mär 2025 18:44:49 CET] Verifying: next.example.com
[Mi 26 Mär 2025 18:44:50 CET] Processing. The CA is processing your order, please wait. (1/30)
[Mi 26 Mär 2025 18:44:54 CET] Success
[Mi 26 Mär 2025 18:44:54 CET] Removing DNS records.
[Mi 26 Mär 2025 18:44:54 CET] Removing txt: NYgFoj-xxxxxxxxxxxxxxxxxxxxxx for domain: _acme-challenge.next.example.com
[Mi 26 Mär 2025 18:44:59 CET] Record deleted
[Mi 26 Mär 2025 18:44:59 CET] Successfully removed
[Mi 26 Mär 2025 18:44:59 CET] Verification finished, beginning signing.
[Mi 26 Mär 2025 18:44:59 CET] Let's finalize the order.
[Mi 26 Mär 2025 18:44:59 CET] Le_OrderFinalize='https://acme.zerossl.com/v2/DV90/order/xxxxxxxxxxxxxxxxxxxxxx/finalize'
[Mi 26 Mär 2025 18:45:02 CET] Order status is 'processing', let's sleep and retry.
[Mi 26 Mär 2025 18:45:02 CET] Sleeping for 15 seconds then retrying
[Mi 26 Mär 2025 18:45:18 CET] Polling order status: https://acme.zerossl.com/v2/DV90/xxxxxxxxxxxxxxxxxxxxxx
[Mi 26 Mär 2025 18:45:22 CET] Downloading cert.
[Mi 26 Mär 2025 18:45:22 CET] Le_LinkCert='https://acme.zerossl.com/v2/DV90/cert/xxxxxxxxxxxxxxxxxxxxxx'
[Mi 26 Mär 2025 18:45:25 CET] Cert success.
-----BEGIN CERTIFICATE-----
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
1111111111111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333
444444444444444444444444444444==
-----END CERTIFICATE-----
[Mi 26 Mär 2025 18:45:25 CET] Your cert is in: /home/user/.acme.sh/next.example.com_ecc/next.example.com.cer
[Mi 26 Mär 2025 18:45:25 CET] Your cert key is in: /home/user/.acme.sh/next.example.com_ecc/next.example.com.key
[Mi 26 Mär 2025 18:45:25 CET] The intermediate CA cert is in: /home/user/.acme.sh/next.example.com_ecc/ca.cer
[Mi 26 Mär 2025 18:45:25 CET] And the full-chain cert is in: /home/user/.acme.sh/next.example.com_ecc/fullchain.cer
Die Zertifikatsdateien wurden auf dem eigenen Server im Verzeichnis /home/user/.acme.sh/.acme.sh/next.example.com_ecc/
abgespeichert.
Ein Blick in den Ordner zeigt die Dateien:
ls -lah
insgesamt 40K
drwxr-xr-x 2 user user 4.0K 26. Mär 19:45 .
drwx------ 7 user user 4.0K 26. Mär 19:44 ..
-rw-r--r-- 1 user user 2.7K 26. Mär 19:45 ca.cer
-rw-r--r-- 1 user user 4.1K 26. Mär 19:45 fullchain.cer
-rw-r--r-- 1 user user 1.5K 26. Mär 19:45 next.example.com.cer
-rw-r--r-- 1 user user 625 26. Mär 19:45 next.example.com.conf
-rw-r--r-- 1 user user 469 26. Mär 19:44 next.example.com.csr
-rw-r--r-- 1 user user 188 26. Mär 19:44 next.example.com.csr.conf
-rw------- 1 user user 227 26. Mär 19:44 next.example.com.key
Jede Datei kann z.B. mit cat
angeschaut werden.
Die Dateiendung gibt Aufschluss über die Funktion:
.ca.cer
= Certificate of Certificate authority.fullchain.cer
= EnthältServer Certificate
,Intermediate Certificates
undRoot Certificate
(✅).cer
= CERTIFICATE (✅).conf
= Configuration file.csr
= CERTIFICATE REQUEST.csr.conf
= CERTIFICATE REQUEST Configuration.key
= PRIVATE KEY (✅)
(✅) = wird für die Apache2-Konfiguration benötigt.
7. Zertifikate automatisiert erneuern - CRON
Ein Let's Encrypt Zertifikat ist nur 90 Tage gültig und muss kurz vor Ablauf aktualisiert werden.
acme.sh
startet die Aktualisierung automatisiert mit einem CRON ⏲️ alle 60 Tage.
Während der Installation von acme.sh
wird automatisch ein CRON erstellt, der geprüft werden sollte.
Der Befehl legt automatisch einen CRON ⏲️ für den Benutzer ROOT
an.
acme.sh --install-cronjob
Der CRON sollte geprüft werden, damit zur Ausführungszeit der Server auch aktiv und eine Internetverbindung verfügbar ist. Die Zeile ist ganz am Ende zu finden.
# CRONs anzeigen
crontab -l
# CRONs bearbeiten
crontab -e
Beispiel CRON:
45 17 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
Der CRON lässt sich mit dem Befehl wieder entfernen:
acme.sh --uninstall-cronjob
Während der Installation mithilfe des Git-Repositories wird automatisch für den Benutzer ein CRON ⏲️ angelegt.
crontab -e
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]: 1
Der Befehl legt automatisch einen CRON für den Benutzer 👤 an.
acme.sh --install-cronjob
Der CRON sollte geprüft werden, damit zur Ausführungszeit der Server auch aktiv und eine Internetverbindung verfügbar ist. Die Zeile ist ganz am Ende zu finden.
# CRONs anzeigen
crontab -l
# CRONs bearbeiten
crontab -e
Beispiel CRON:
45 17 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null
Der CRON lässt sich mit dem Befehl wieder entfernen:
acme.sh --uninstall-cronjob
8. Apache Konfigurationsdatei anpassen
Die Apache-Konfigurationsdatei für die Nextcloud liegen im Verzeichnis /etc/apache2/site-available/nextcloud.conf
(1) und sind anzupassen, damit die neuen geholten Zertifikate verwendet werden können.
Der Nextcloud - Der ultimative Installations- und Recovery-Guide 🦸♂️ auf codeberg.org.
Die Let's Encrypt-Zertifikate wurden für die Nextcloud bisher mit Certbot
(1) aktualisiert und im Verzeichnis /etc/letsencrypt/live/next.example.com/
abgelegt.
Certbot-Installation im Nextcloud - Der ultimative Installations- und Recovery-Guide 🦸♂️ auf codeberg.org..
Die Zertifikate liegen in beiden Fällen, ROOT
- und Benutzer-Installation, im Home-Verzeichnis und sind für den Webserver noch unerreichbar.
Die Apache-Konfigurationsdatei für die Nextcloud liegen im Verzeichnis /etc/apache2/site-available/nextcloud.conf
(1) und sind anzupassen, damit die neuen Zertifikate verwendet werden können.
Der Nextcloud - Der ultimative Installations- und Recovery-Guide 🦸♂️ auf codeberg.org.
8.1. Neue Verzeichnisse anlegen
Es wird ein neuer 📂 Ordner /etc/apache2/acme
angelegt. In Unterordner lassen sich die Zertifikate organisieren, wie z.B. für die Nextcloud.
sudo mkdir /etc/apache2/acme
sudo mkdir /etc/apache2/acme/next.example.com
8.2. Apache2-Konfigurationsdatei anzupassen
Warning
Erst mit einer Änderung der Konfigurationsdateien und einem Neustart des Webservers werden die neuen Zertifikate aktiv verwendet.
Wird dieser Schritt ausgelassen bzw. übersprungen, passiert nichts. So kann acme.sh
(fast) gefahrlos getestet werden.
Der Pfad in der Apache2-Konfigurationsdatei ist anzupassen
sudo cp /etc/apache2/sites-available/nextcloud.conf /home/user/
sudo nano /etc/apache2/sites-available/nextcloud.conf
Im Abschnitt <VirtualHost *:443>
sind die entsprechenden Zeilen zu finden.
# ALTE
SSLCertificateFile /etc/letsencrypt/live/next.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/next.example.com/privkey.pem
# NEU
SSLCertificateFile /etc/apache/acme/next.example.com/fullchain.pem
SSLCertificateKeyFile /etc/apache/acme/next.example.com/privkey.pem
Die Anpassungen der Apache2-Konfigurationsdateien sind fertig und acme.sh
kann die Zertifikate automatisch in das neue Verzeichnis kopieren.
9. Zertifikate an Webserver verteilen
Das Verteilen der Zertifikate erledigt acme.sh
mit dem Befehl, für den die Pfade noch anzupassen sind: 1
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
--install-cert
: Das Zertifikat wird installiert--apache
: Es wird der Apache-Webserver verwendet,acme.sh
wird dann die Konfigurationsdateien für Apache suchen und automatisch anpassen.--cert-file
: Speicherort des Zertifikatscert.pem
(dies ist normalerweise der Standardpfad innerhalb von~/.acme.sh/
).--key-file
: Speicherort des privaten Schlüssels*.key
.--fullchain-file
: Speicherort des gesamten Zertifikatsbündels (Zertifikat + Zwischenzertifikate)fullchain.pem
.--reloadcmd
: Der Webserver wird neu gestartet, damit die neuen Zertifikate geladen werden.
Damit acme.sh
die Zertifikate für das Setup korrekt verteilt, wurde der Befehl angepasst:
acme.sh --install-cert -d next.example.com \
--apache \
--cert-file /etc/apache/acme/next.example.com/cert.pem \
--key-file /etc/apache/acme/next.example.com/privkey.pem \
--fullchain-file /etc/apache/acme/next.example.com/fullchain.pem \
--reloadcmd "service apache2 force-reload"cd
acme.sh
verteilt die Zertifikate in das Verzeichnis /etc/apache2/acme/next.example.com/
.
[Mi 26 Mär 2025 18:44:00 CET] The domain 'next.example.com' seems to already have an ECC cert, let's use it.
[Mi 26 Mär 2025 18:44:00 CET] Installing cert to: /etc/apache2/acme/next.example.com/cert.pem
[Mi 26 Mär 2025 18:44:00 CET] Installing key to: /etc/apache2/acme/next.example.com/privkey.pem
[Mi 26 Mär 2025 18:44:00 CET] Installing full chain to: /etc/apache2/acme/next.example.com/fullchain.pem
Die Zertifikate lassen sich im Ordner /etc/apache2/acme/next.example.com/
auflisten:
ls -lah
insgesamt 24K
drwxr-xr-x 2 root root 4.0K 27. Mär 14:42 .
drwxr-xr-x 3 root root 4.0K 27. Mär 08:55 ..
-rw-r--r-- 1 root root 1.5K 27. Mär 14:42 cert.pem
-rw-r--r-- 1 root root 4.1K 27. Mär 14:42 fullchain.pem
-rw------- 1 root root 227 27. Mär 14:42 privkey.pem
Versucht man den acme.sh
-Befehl als normaler Benutzer auszuführen, wird der Vorgang wegen fehlender Berechtigungen abgebrochen 🛑.
Der Benutzer user
hat keine Schreibrechte in das Verzeichnis /etc/apache2/acme/next.example.com
.
acme.sh --install-cert -d next.example.com \
--apache \
--cert-file /etc/apache2/acme/next.example.com/cert.pem \
--key-file /etc/apache2/acme/next.example.com/privkey.pem \
--fullchain-file /etc/apache2/acme/next.example.com/fullchain.pem
[Mi 26 Mär 2025 18:44:55 CET] The domain 'next.example.com' seems to already have an ECC cert, let's use it.
[Mi 26 Mär 2025 18:44:55 CET] Installing cert to: /etc/apache2/acme/next.example.com/cert.pem
./acme.sh: Zeile 5925: /etc/apache2/acme/next.example.com/cert.pem: Keine Berechtigung
Der Befehl muss mit sudo
und der --force
Option ausgeführt werden.2
sudo acme.sh --install-cert -d next.example.com \
--apache \
--cert-file /etc/apache2/acme/next.example.com/cert.pem \
--key-file /etc/apache2/acme/next.example.com/privkey.pem \
--fullchain-file /etc/apache2/acme/next.example.com/fullchain.pem \
--force
🚨 Ein Test mit sudo
und --force
wurde von mir nicht durchgeführt.
Hilfestellung bietet das acme.sh-Wiki auf GitHub
Die Zertifikate wurden mit dem obigen Befehl einamlig 1️⃣ an den Webserver verteilt. Bezieht acme.sh
nach 60 Tagen neue Zertifikate, muss der Befehl erneut eingegeben werden.
Ein manuelles Ausführen beinhaltet immer das Risiko, dass es vergessen wird. Eine Automatisierung 🔄 mit CRON ⏲️ ist zwingend zu empfehlen❗️
Der Ausführungzeitraum von CRON sollte sich an 👉 5. Zertifikate automatisiert erneuern - CRON orientieren und acme.sh
genügen Zeit gegeben werden, um das Zertifikat zu erneuern.
Option 1️⃣: Eintragen mit Benutzer ROOT
sudo su
root@nextcloud:/home/user# whoami
root
root@nextcloud:/home/user# crontab -e
Option 2️⃣: Eintragen als normaler Benutzer
sudo crontab -e
Die Zeile ist am Ende der Datei einzufügen.
55 17 * * * "/root/.acme.sh"/acme.sh --cron --home "acme.sh --install-cert -d next.example.com --apache --cert-file /etc/apache/acme/next.example.com/cert.pem --key-file /etc/apache/acme/next.example.com/privkey.pem --fullchain-file /etc/apache/acme/next.example.com/fullchain.pem --reloadcmd "service apache2 force-reload" > /dev/null
Wird der Befehl als normaler Benutzer ausgeführt, stellt sich das Problem mit den fehlenden Schreibrechten für das Verzeichnis /etc/apache/acme/next.example.com/
.
Möchte man acme.sh
als normaler Benutzer verwenden, ist eine andere Lösung zu wählen.
Eine Möglichkeit wäre, dass acme.sh
die Zertifikate in ein schreibbares Verzeichnis gibt und anschließend über einen CRON die Dateien mithilfe von cp
oder rsync
in das Verzeichnis /etc/apache/acme/next.example.com/
übertragen werden.
Zum Abschluss muss der Webserver immer neu gestartet werden:
sudo systemctl restart apache2
Eine andere Möglichkeit wäre die Anpassung der /etc/sudoers
mit dem Befehl sudo visudo
, damit der normale Benutzer die notwendigen Befehle ausführen darf..
visudo
🚨 /etc/sudoers
nur mit visudo
bearbeiten, nie einen Editor wie nano, vi oder vim verwenden.
10. Wichtige acme.sh Befehle
10.1 acme.sh - Update
sudo su
root@nextcloud:/home/user# whoami
root
# Update manuell
acme.sh --upgrade
# Update automatisch
acme.sh --upgrade --auto-upgrade
# Automatische Update abschalten
acme.sh --upgrade --auto-upgrade 0
# Update manuell
acme.sh --upgrade
# Update automatisch
acme.sh --upgrade --auto-upgrade
# Automatische Update abschalten
acme.sh --upgrade --auto-upgrade 0
10.2 Benachrichtigungen
acme.sh
kann über unterschiedliche Wege Nachrichten verwenden. Im Wiki sind diese Möglichkeiten beschrieben.
Auf dem Nextcloud-Server wurde bereits Postfix installiert und konfiguriert. Darauf kann acme.sh
aufsetzen und verwenden.
Der Befehl muss als ROOT
ausgeführt werden.
sudo su
root@nextcloud:/home/user# whoami
root
Es werden dafür die beiden Variablen verwendet:6
export MAIL_FROM="xxx@xxx.com" # or "Xxx Xxx <xxx@xxx.com>", currently works only with sendmail
export MAIL_TO="xxx@xxx.com" # your account e-mail will be used as default if available
Es werden dafür die beiden Variablen verwendet:6
export MAIL_FROM="xxx@xxx.com" # or "Xxx Xxx <xxx@xxx.com>", currently works only with sendmail
export MAIL_TO="xxx@xxx.com" # your account e-mail will be used as default if available
Um Probleme zu vermeiden, sollte die E-Mail-Adresse der Variable MAIL_FROM
deckungsgleich mit dem Eintrag in der /etc/postfix/sasl_passwd
sein.
Nextcloud - Der ultimative Installations- und Recovery-Guide 🦸♂️
In der Installationsanleitung für die Nextcloud ist auch die Konfiguration von Postfix ausführlich beschreiben.
Dein Weg zur eigenen Nextcloud 👍
11. Optional - Backup
Eine Sicherung der Zertifikate kann sehr leicht realisiert werden. Man erstellt als ROOT
oder mit sudo
einfach ein zip
-Archiv des Ordners.
zip -r /home/user/backup/acme_backup_$(date +%Y%m%d).zip ~/.acme.sh/next.example.com_ecc/
adding: root/.acme.sh/next.example.com_ecc/ (stored 0%)
adding: root/.acme.sh/next.example.com_ecc/next.example.com.csr.conf (deflated 31%)
adding: root/.acme.sh/next.example.com_ecc/fullchain.cer (deflated 36%)
adding: root/.acme.sh/next.example.com_ecc/next.example.com.csr (deflated 22%)
adding: root/.acme.sh/next.example.com_ecc/backup/ (stored 0%)
adding: root/.acme.sh/next.example.com_ecc/ca.cer (deflated 34%)
adding: root/.acme.sh/next.example.com_ecc/next.example.com.key (deflated 16%)
adding: root/.acme.sh/next.example.com_ecc/next.example.com.conf (deflated 53%)
adding: root/.acme.sh/next.example.com_ecc/next.example.com.cer (deflated 30%)
Es wird das Verzeichnis root/.acme.sh/next.example.com_ecc
in den Ordner /home/user/backup/
kopiert. Mit der Variable $(date +%Y%m%d)
wird das aktuelle Tagesdatum in den Dateinamen geschrieben.
Auf dem gleichen Weg lässt sich auch der Ordner /etc/apache2/acme/next.example.com/
sichern.
Mit Tools, wie rsync , Borg können die zip-Archive unkompliziert auf andere Server / Speichermedien gesichert werden.
💡 openmediavault und rsync
openmediavault (omv) bringt das mächtige Tool rsync mit, dass sich hervorragend für die Datensicherung eignet.
12. Überwachung von Zertifikaten
Die Überwachung von Zertifikaten im Netzwerk ist sehr wichtig. Läuft ein Zertifikat ab und wird nicht rechzeitig erneuert erzeugt das viele Probleme im eigenen Netzwerk und Geräte können sich aufeinmal nicht mehr an den Servern und Diensten anmelden.
Ein eigenes Monitoring schafft hier Abhilfe. Mit Docker kann eine solche Lösung sehr schnell aufgesetzt werden.
Ich verwende dafür in meinem Netzwerk Uptime Kuma, dass als Docker Container auf einer Synology läuft.
Es wird automatisch das Ablaufdatum aller meiner Zertifikate überwacht und einige Tage vor Ablauf 🔚 erhalte ich eine Nachricht per E-Mail und Gotify.
13. Quellen
- https://github.com/acmesh-official/acme.sh
- https://community.hetzner.com/tutorials/automating-ssl-certificates-with-acmesh-dns
- https://www.cyberciti.biz/faq/how-to-add-cron-job-entry-for-acme-sh/
Gib mir gerne einen Kaffee ☕ aus 😀
Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.
Follow Me
Source
- Teile des Artikels wurden mit maschineller Hilfe erstellt.
- Foto von Markus Winkler auf Unsplash