Let’s Encrypt Wildcard Zertifikat auf der Synology NAS
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: