Synology DS214se && SSL

Kurt Klinner

Nachdem ich ab und an auf mein privates NAS von unterwegs zugreife, war es an der Zeit auch an dieser Stelle SSL zu aktivieren. Kandidat der Stunde ist sicherlich Letsencrypt, welches ich mir im konkreten Fall zur Hilfe nahm.

Voraussetzung für das Erzeugen des Zertifikats ist, dass das NAS bereits per http von extern erreichbar ist (in meinem Fall nutze ich den Dienst von Synology um den dyndns-artigen externen Zugriff zu ermöglichen).

Nachdem man sich den Client mittels

git clone https://github.com/letsencrypt/letsencrypt

lokal auf den Rechner geklont hat, startet man die Generierung des Zertifikats per

cd letsencrypt
./letsencrypt-auto certonly -a manual --email <EMAILADDRESS> -d <DOMAIN>

Man bestätigt kurz, dass die IP der anfragenden Instanz gespeichert werden darf

und folgt den Details bzgl. der weiteren Schritte

Make sure your web server displays the following content at
before continuing:
http://<DOMAIN>/.well-known/acme-challenge/63TunKaCrLn6W81k3nemik9Ts9qQZ14wj6o-CElPwVM

63TunKaCrLn6W81k3nemik9Ts9qQZ14wj6o-CElPwVM.JIhnKJ06_E3dvirZOGkbtAhAbg9r2Tg8Txn-v5P4RHM

If you don't have HTTP server configured, you can run the following
command on the target server (as root):

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
cd /tmp/letsencrypt/public_html
printf "%s"
63TunKaCrLn6W81k3nemik9Ts9qQZ14wj6o-CElPwVM.JIhnKJ06_E3dvirZOGkbtAhAbg9r2Tg8Txn-v5P4RHM
> .well-known/acme-challenge/63TunKaCrLn6W81k3nemik9Ts9qQZ14wj6o-CElPwVM
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer(('', 80),
SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()"

Man hat zwei Optionen an dieser Stelle, entweder startet man wie vorgeschlaggen einen HTTPServer mittels des python Aufruf (was für mich aber bedeutet hätte, dass ich den Webserver des NAS stoppen
muss) oder man hinterlegt die Datei mit dem generierten, kryptischen Namen ala 63TunKaCrLn6W81k3nemik9Ts9qQZ14wj6o-CElPwVM
unterhalb des /.well-known/acme-challenge/ Verzeichnisses.

In meinem Fall hab ich die zweite Option gewählt.

Das für das Hinterlegen der Datei entscheidende DOCUMENTROOT findet sich in der /etc/httpd/conf/httpd.conf-sys konfiguriert. Konkret handelt es sich hierbei um das Verzeichnis
/usr/syno/synoman

Flott also die Verzeichnisstruktur mittels

cd /usr/syno/synoman
mkdir -p .well-known/acme-challenge/

erzeugt und die Datei per

touch /usr/syno/synoman/.well-known/acme-challenge/<FILENAME>

angelegt

Sobald obige Punkte ausgeführt sind (und man z.B. mittels Curl verifiziert hat das der Zugriff auf das File möglich ist), bestätigt man mit Enter

Die Letsencrypt-Server versuchen nun die Authentifizierungsdatei vom Webserver abzuholen und kontrollieren sie dann auf Gültigkeit.
Passt soweit alles und wurden das Zertifikat erzeuft, so taucht eine Meldung ala

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/<DOMAIN>/fullchain.pem. Your cert will expire on 2016-03-02. To obtain a new version of the certificate in the future, simply run Let's Encrypt again.

auf

Die erzeugten Files finden sich unter /etc/letsencrypt/live/DOMAIN

Anschliessend geht es an die Konfiguration des Synology NAS.

In der Administrationsoberfläche wechselt man in die Systemsteuerung unter den Punkt Netzwerk und wählt dort die Option DSM-Einstellungnen.

Im ersten Schritt aktiviert man die Optionen "HTTPS-Verbindung aktivieren" und "HTTP-Verbindung automatisch zu HTTPS umleiten ..."

Als nächstes hinterlegt man die Zertifikatsdateien (auf der aktuellen Seite dem "Zertifikat" Link folgen)

und et voila SSL ist für das NAS aktiv

Nachtrag:

Die aktuellste DSM Version liefert nun out-of-the-box die Möglichkeit ein Zertifikat via letsencrypt zu konfiguriere, allerdings scheint der Ansatz noch ein wenig problembehaftet. Auslöser in meinem Fall (unabhängig ob ich den beschriebenen Weg oder die WebUI nutze) scheint folgende Zeile in der nginx.conf zu sein

 location ~ /\. { access_log off; log_not_found off; deny all; }

welcher den Zugriff auf die Hidden-Files verhindert. Nachdem ich den Eintrag auskommentiert und die neue Config mittels

nginx -s reload

neu geladen hatte, klappte alles wie erwartet