Wozu benötigen wir ein Wildcard Zertifikat
Auf der Synology kann man Let’s Encrypt Zertifikate für seine Domain und Aliase (Hostnamen) erstellen. Dafür stehen 255 Zeichen zur Verfügung. Einfacher als verschiedene Aliase anzugeben ist ein ein Wildcard Zertifikat. D.h. ein Zertifikat welches für alle Hostnamen deiner Domain gültig ist. Unter Sicherheitsaspekten ist es natürlich besser jeden einzelnen Hostnamen im Zertifikat aufzunehmen!
Wenn ich über die Synology das Let’s Encrypt Zertifkat erneuere, muss ich jedesmal alle betroffenen Hosts die in dem Zertifikat stehen, aus dem Reverse Proxy auf der Synology austragen. Dann nutze ich noch ein MACVLAN, welches ich deaktivieren muss. Also eine extreme aufwändige Prozedur die ich alle 3 Monate wiederholen darf. Auch muss ich immer meine öffentlichen DNS-IP-Adresse bei der Zertifikatserstellung bei meinem Provider ändern die dann auf die Synology verweist. Sonst schlägt die automatische Erneuerung leider fehl. Außerdem gibt es noch eine Beschränkung von 255 Zeichen im Textfeld der Synology für die zu zertifizierenden Hosts.
Das beschriebenes Vorgehen ist alle 3 Monate manuell zu wiederholen. Das ist sehr aufwändig und zeitintensiv.
So erstellst Du ein Wildcard Zertifikat auf Deiner Synology NAS
Wir erstellen das Wildcard Zertifikat mit dem Skript acme.sh. Für die Authentifizierung des Domainnamens verwenden wir die DNS-Option. Melde Dich auf Deiner Synology mit Deinem User (nicht root) per ssh an. Lege das Skript acme.sh in Deinem Homeverzeichnis in dem Verzeichnis bin ab.
mkdir ~/bin
cd ~/bin
wget https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh
chmod 755 acme.sh
Als nächstes erstellen wir das Zertifikat. Ersetze *.stueben.de durch Deine eigene Domain. Um eine Top-Level-Domain oder eine Multi-Domain hinzuzufügen, füge „-d yourdomain“ hinzu.
cd ~/bin
./acme.sh --issue -d *.stueben.de --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
Folgende Rückmeldung solltest Du erhalten:
[Sun Oct 27 08:18:12 CET 2019] Create account key ok.
[Sun Oct 27 08:18:12 CET 2019] Registering account
[Sun Oct 27 08:18:14 CET 2019] Registered
[Sun Oct 27 08:18:14 CET 2019] ACCOUNT_THUMBPRINT='OuqqNc4VNtutodAx0lwSenoimHXamOGq7hst8UhbNlM'
[Sun Oct 27 08:18:14 CET 2019] Creating domain key
[Sun Oct 27 08:18:15 CET 2019] The domain key is here: /home/thorsten/.acme.sh/*.stueben.de/*.stueben.de.key
[Sun Oct 27 08:18:15 CET 2019] Single domain='*.stueben.de'
[Sun Oct 27 08:18:15 CET 2019] Getting domain auth token for each domain
[Sun Oct 27 08:18:17 CET 2019] Getting webroot for domain='*.stueben.de'
[Sun Oct 27 08:18:17 CET 2019] Add the following TXT record:
[Sun Oct 27 08:18:17 CET 2019] Domain: '_acme-challenge.stueben.de'
[Sun Oct 27 08:18:17 CET 2019] TXT value: 'xyzPdaswererfdsf_v9xdfsdfHdsfhHLWEFldsfsf'
[Sun Oct 27 08:18:17 CET 2019] Please be aware that you prepend _acme-challenge. before your domain
[Sun Oct 27 08:18:17 CET 2019] so the resulting subdomain will be: _acme-challenge.stueben.de
[Sun Oct 27 08:18:17 CET 2019] Please add the TXT records to the domains, and re-run with --renew.
[Sun Oct 27 08:18:17 CET 2019] Please add '--debug' or '--log' to check more details.
[Sun Oct 27 08:18:17 CET 2019] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh
Nun merkst Du Dir die beiden Einträge unter „Add the following TXT record:“. I meinem Fall:
Domain: ‚_acme-challenge.stueben.de‚
TXT value: ‚xyzPdaswererfdsf_v9xdfsdfHdsfhHLWEFldsfsf‚
Jetzt rufst Du bei Deinem Provider die DNS Einstellungen auf und fügst für Deine Domain einen TXT Eintrag hinzu. Bei meinem Provider 1und1 sieht das für die Domain stueben.de wie folgt aus:
Nun rufst Du das Skript acme.sh wie oben, nur mit dem Parameter –renew statt –issue auf.
cd ~/bin
./acme.sh --renew --force -d *.stueben.de --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
Die Ausgabe sollte ungefähr wie folgt aussehen.
[Sun Oct 27 08:21:21 CET 2019] Renew: '*.stueben.de'
[Sun Oct 27 08:21:23 CET 2019] Single domain='*.stueben.de'
[Sun Oct 27 08:21:23 CET 2019] Getting domain auth token for each domain
[Sun Oct 27 08:21:23 CET 2019] Verifying: *.stueben.de
[Sun Oct 27 08:21:28 CET 2019] Success
[Sun Oct 27 08:21:28 CET 2019] Verify finished, start to sign.
[Sun Oct 27 08:21:28 CET 2019] Lets finalize the order, Le_OrderFinalize: https://acme-v02.api.letsencrypt.org/acme/finalize/1324234324/234324323423
[Sun Oct 27 08:21:30 CET 2019] Download cert, Le_LinkCert: https://acme-v02.api.letsencrypt.org/acme/cert/24234abc42dd2983dabcfe24
[Sun Oct 27 08:21:31 CET 2019] Cert success.
[Sun Oct 27 08:21:31 CET 2019] Your cert is in /home/thorsten/.acme.sh/*.stueben.de/*.stueben.de.cer
[Sun Oct 27 08:21:31 CET 2019] Your cert key is in /home/thorsten/.acme.sh/*.stueben.de/*.stueben.de.key
[Sun Oct 27 08:21:31 CET 2019] The intermediate CA cert is in /home/thorsten/.acme.sh/*.stueben.de/ca.cer
[Sun Oct 27 08:21:31 CET 2019] And the full chain certs is there: /home/thorsten/.acme.sh/*.stueben.de/fullchain.cer
[Sun Oct 27 08:21:32 CET 2019] It seems that you are using dns manual mode. please take care: The dns manual mode can not renew automatically, you must issue it again manually. You'd better use the other modes instead.
[Sun Oct 27 08:21:32 CET 2019] Call hook error.
Du kopierst die Zertifikate in einen Ordner auf der NAS den Du um das Let’s Encrypt Zertifikat zu importieren öffnen darfst. Das funktioniert nicht aus dem .acme.sh Verzeichnis wegen des führendem . im Namen.
mkdir /home/thorsten/certs
cp /home/thorsten/.acme.sh/\*.stueben.de/\*.stueben.de.cer /home/thorsten/certs/stueben.de.cer
cp /home/thorsten/.acme.sh/\*.stueben.de/\*.stueben.de.key /home/thorsten/certs/stueben.de.key
cp /home/thorsten/.acme.sh/\*.stueben.de/ca.cer /home/thorsten/certs/ca.cer
cp /home/thorsten/.acme.sh/\*.stueben.de/fullchain.cer /home/thorsten/certs/fullchain.cer
Nun öffnest Du auf der Synology NAS die Systemsteuerung, wählst den Punkt Sicherheit aus und oben in der Menüleiste Zertifikate und importierst die eben erstellten Zertifikate aus dem Verzeichnis.
Damit ist das Wildcard Zertifikat erstellt. Dieses sieht wie folgt aus:
Matis
Vielen Dank für die Beschreibung! Funzt einwandfrei und ist sehr sehr hilfreich!
Stephan
Super, vielen Dank.
Wie verhält sich die Sache bei der Erneuerung? Muss man diese über den gleichen Weg durchführen, oder kann sich ab da die DS selbst drum kümmern?
Stübi
Leider habe ich noch keinen Weg gefunden um nicht die meisten Schritte oben zu wiederholen.
Stephan
Die Erneuerung scheint bei mir zu funktionieren. Ich habe sie jetzt einmal mit dem Parameter –force erzwungen. Den Textrecord musste ich nicht erneut erstellen. Mal sehen, wie es nach der ersten regulären Erneuerung aussieht.
Ich habe mir die einzelnen Schritte in ein Skript gepackt. Die fertigen Zertifikate kopiere ich direkt (als root) in den DSM-Zertifikatsordner [/usr/syno/etc/certificate/_archive/xxxxxx] (den Unterordner für dieses Zertifikat muss man natürlich vorher eimalig suchen).
Die Namen der Dateien muss man entsprechend anpassen:
CERTPATH=/usr/syno/etc/certificate/_archive/xxxxxx
cp /home/thorsten/.acme.sh/\*.stueben.de/\*.stueben.de.cer ${CERTPATH}/cert.pem
cp /home/thorsten/.acme.sh/\*.stueben.de/\*.stueben.de.key ${CERTPATH}/privkey.pem
cp /home/thorsten/.acme.sh/\*.stueben.de/ca.cer ${CERTPATH}/chain.pem
cp /home/thorsten/.acme.sh/\*.stueben.de/fullchain.cer ${CERTPATH}/fullchain.pem
Und noch etwas:
Ich habe mir das Zertifikat neben der Wildcard-Domain zusätzlich für die Hauptdomain erstellt, weil es sonst beim Aufruf dieser zu einem Zertifikatsfehler kommt. (… -d stueben.de -d *.stueben.de …)
Gruß
Stephan
Sven
Vielen Dank für die Anleitung. Die Frage von Stephan zur Erneuerung würde mich auch brennend interessieren….
Vielen Dank im Voraus.
Stübi
Danke Stephan für die coole Beschreibung. Ich werde das Skript im Blog anpassen. Wenn man das „Lets encrypt Zertifikat“ als Standard Zertifikat festlegt, kann man das richtige Verzeichnis aus der Datei /usr/syno/etc/certificate/_archive/DEFAULT lesen.
Muss man nach der Erneuerung und kopieren der Zertifikate in das Verzeichnis /usr/syno/etc/certificate/_archive/XXXX den Synology Webserver neu starten?
Hast Du das Skript zum erneuern wie folgt aufgerufen. ./acme.sh –renew –force . Das funktioniert bei mir leider nicht.
Jay
Danke für den Beitrag! Damit acme.sh Let’s Encrypt verwendet muss es inzwischen zunächst als Default CA gesetzt werden:
acme.sh –set-default-ca –server letsencrypt
Ansonsten wird ZeroSSL verwendet.
Weitere Infos im acme.sh Wiki: https://github.com/acmesh-official/acme.sh/wiki/Change-default-CA-to-ZeroSSL
Speedy
Hi Danke für die Einleitung
wen es Interessiert habe ich mal für DSM 7.x ein ReNew script geschrieben
Stübi
Ich hätte Interesse an dem ReNew Script. Kannst Du das Script hier veröffentlichen oder mir schicken, dann würde ich es mit dem Beitrag aufnehmen.
Speedy
Habs per Email geschickt.
Die vorderen Abläufe von dir muss man aber trotzdem manuell vorher machen
Walter
Ich hätte auch Interesse an dem Renew-Script.
Danke im voraus.
Torsten
klasse anleitung. stehe auch kurz vor der erneuerung. auch ich hätte interesse an dem script;-)
gruß
tori
tori
hi speedy,
kannst du mir das script bitte auch mal zuschicken?
e-mail: tori@licioli.de
bg
tori
Speedy
Im Script fehlt im acme command noch das bin
also &USER_HOME/bin/acme.sh und nicht &USER_HOME/acme.sh
ansonsten läuft es richtig
Rac3r
Servus
Ich hätte auch Interesse am Script… würdest du es mir auch schicken ?
Speedy
Anmerkung im Script
synosystemctl restart nginx austauschen in synosystemctl reload nginx
ansonsten wird alles gekillt wie bei mir z.b. Virtual Machine ‚Manager u.a. PKG’s und
das ist bei virtual laufenden Server nicht gut
Speedy
Nachtrag
Im Script kannst du noch in Syno Protokoll schreiben
mit dem Befehl
synologset1 sys info 0x11100000 „Zertifikat wird erneuert“
was man halt mit dokumentieren will
Bastler
Hallo,
kann ich die Anleitung im Beitrag noch bedenkenlos verwenden, sind ie neuerungen schon eingepflegt? Wird es automatisch erneuert (Hab das hier gefunden,funktioniert das auch?: https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide#configuring-certificate-renewal?
Was muss ich noch beachten, bin kin Profi?
Vielen Dank schon mal für Eure Antwort.
Speedy
Hier mal das Script
Wenn ihr hier nur wildcard gemacht habt dann müsst ihr
beim Quell Pfad vom kopieren ändern in
cp $USER_HOME/.acme.sh/*.domain.de/*.domain.de.cer $CERTPATH/cert.pem
cp $USER_HOME/.acme.sh/*.domain.de/*.domain.de.key $CERTPATH/privkey.pem
cp $USER_HOME/.acme.sh/*.domain.de/ca.cer $CERTPATH/chain.pem
cp $USER_HOME/.acme.sh/*.domain.de/fullchain.cer $CERTPATH/fullchain.pem
#########
!/bin/bash
#
Update LetsEncrypt Wildcard-Certificate
#
Params XXXX Certpath
CERTPATH=“/usr/syno/etc/certificate/_archive/XXXXX“
PEM=“fullchain.pem“
DAYS=“604800″
OPENSSL=“/usr/bin/openssl“
User der im DSM für das acme.sh verwendet wird
USER=“USERNAME“
Optional Emby Server
EMBYSSLPATH=“PATHTOEMBYCERT“
EMBYSSL=“Emby.pfx“
PASSOUT=“PASSWORDFOREMBYCERT“
USER_HOME=$(bash -c „cd ~$(printf %q „$USER“) && pwd“)
Check Cert will be Expire in VALUE $DAYS
$OPENSSL x509 -enddate -noout -in „$CERTPATH/$PEM“ -checkend „$DAYS“ | grep -q ‚Certificate will expire‘
if [ $? -eq 0 ]
then
# Renew LetsEncrypt command
su $USER -c „$USER_HOME/bin/acme.sh –renew –force -d domain.de -d *.domain.de –dns –yes-I-know-dns-manual-mode-enough-go-ahead-please“
# Copy Certifikate to SynoPath
cp $USER_HOME/.acme.sh/domain.de/domain.de.cer $CERTPATH/cert.pem
cp $USER_HOME/.acme.sh/domain.de/domain.de.key $CERTPATH/privkey.pem
cp $USER_HOME/.acme.sh/domain.de/ca.cer $CERTPATH/chain.pem
cp $USER_HOME/.acme.sh/domain.de/fullchain.cer $CERTPATH/fullchain.pem
# Synology Web Server neu starten
synosystemctl reload nginx
# Optional der einen Emby Media Server betreibt
# Emby Server Stop
/usr/syno/bin/synopkg stop EmbyServer
# Create Pfx-Cert for Emby
$OPENSSL pkcs12 -inkey $CERTPATH/privkey.pem -in $CERTPATH/fullchain.pem -export -out $EMBYSSLPATH/$EMBYSSL -passout pass:$PASSOUT
# Emby Server Start
/usr/syno/bin/synopkg start EmbyServer
fi
##########
Speedy
Hi,
So ein Nachtrag renew funktioniert soweit nur der Befehl
systemctl reload nginx nicht nach weiterem forschen
ist der Befehl laut Synology Support anders
und zwar so „synow3tool –gen-all && systemctl reload nginx“
und im script ist es auch so macht das –force aus dem script beim acme renew
und DAYS=“2592000″ das sind 30 Tage vor Ablauf Cert sonst bekommt man
dauernd Emails von LetsEncrypt das die Certs ablaufen
Speedy
Sorry noch ein Nachtrag
Webstation auch neu starten
synosystemctl restart pkgctl-WebStation.service
Speedy
Nachtrag !
Für Strato DNS hätte ich eine Certbot Docker Lösung wenn es interessiert. Da bei mir das Problem
besteht das acme.sh nicht bei Strato die DNS TXT einträge ändern kann.
Für alle anderen die das selbe Problem haben geht der auto renew nicht
Speedy
Hi @ALL
habe mal ein Docker Build gemacht für Certbot mit Strato Auth für AutoReNew der Zertifikate
Voraussetzung wie gesagt ist das ihr docker auf der Synology habt.
für andere offizielle DNS die Certbot unterstützt für autorenew muss natürlich der Aufruf dementsprechend
anders sein.
Ihr könnt das Script wenn ihr alle Variablen für euch geändert habt einmal im SSH aufrufen
zum Initialisieren, da beim 1.x eine Email für den Account bei Lets’Encrypt angelegt und
bei euch auf der NAS gesichert wird. Nachdem die passiert ist könnt ihr es in euren Aufgabenplanner
eintragen und alle Tage um X.XX Uhr ausführen.
der Aufruf von acme.sh geht auch wenn ihr einen DNS Provider habt der von acme unterstützt wird,
ansonsten geht das script in den manual mode. Wer den Manual Mode nicht versteht hier die Erklärung
Es muss bei seinem DNS Provider in den DNS Einstellungen manuell der TXT Eintrag erstellt werden mit
den neuen Hashes und das Script läuft as CronJob zwar durch aber es wird kein Zertifikat abgerufen !
Links:
Docker:
https://hub.docker.com/r/speedyhome/certbot_strato
Script:
https://drive.google.com/file/d/1UNn2C9pbzeCA5z9GvlbuiAywXcPz09e7/view?usp=sharing
Viel Spass
Speedy
Hier ist eine Alternative zum Scripten
https://mariushosting.com/synology-how-to-add-wildcard-certificate/