Home » Allgemein » Synology » Let’s Encrypt Wildcard Zertifikat auf der Synology NAS

Let’s Encrypt Wildcard Zertifikat auf der Synology NAS

Veröffentlicht in: Synology 18

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:

18 Responses

  1. Matis
    | Antworten

    Vielen Dank für die Beschreibung! Funzt einwandfrei und ist sehr sehr hilfreich!

  2. Stephan
    | Antworten

    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
      | Antworten

      Leider habe ich noch keinen Weg gefunden um nicht die meisten Schritte oben zu wiederholen.

      • Stephan
        | Antworten

        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

  3. Sven
    | Antworten

    Vielen Dank für die Anleitung. Die Frage von Stephan zur Erneuerung würde mich auch brennend interessieren….
    Vielen Dank im Voraus.

  4. Stübi
    | Antworten

    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.

  5. Jay
    | Antworten

    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

  6. Speedy
    | Antworten

    Hi Danke für die Einleitung
    wen es Interessiert habe ich mal für DSM 7.x ein ReNew script geschrieben

    • Stübi
      | Antworten

      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
        | Antworten

        Habs per Email geschickt.
        Die vorderen Abläufe von dir muss man aber trotzdem manuell vorher machen

    • Torsten
      | Antworten

      klasse anleitung. stehe auch kurz vor der erneuerung. auch ich hätte interesse an dem script;-)
      gruß
      tori

    • tori
      | Antworten

      hi speedy,
      kannst du mir das script bitte auch mal zuschicken?
      e-mail: tori@licioli.de
      bg
      tori

  7. Speedy
    | Antworten

    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
      | Antworten

      Servus

      Ich hätte auch Interesse am Script… würdest du es mir auch schicken ?

  8. Speedy
    | Antworten

    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

  9. Speedy
    | Antworten

    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

  10. Bastler
    | Antworten

    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.

  11. Speedy
    | Antworten

    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

    ##########

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.