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