Let’s Encrypt Wildcard Zertifikat auf der Synology NAS

eingetragen in: Synology 24

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:

ioBroker Docker Container über Kommandozeile starten

eingetragen in: Docker, ioBroker, Synology 0

Am einfachsten ist es den ioBroker Docker Container von Andre Buanet über die grafische Docker Oberfläche der Synology NAS zu installieren. Eine genaue Beschreibung dazu findet Ihr bei Andre auf der Seite unter https://buanet.de/2017/09/iobroker-unter-docker-auf-der-synology-diskstation/.

Leider bietet die Synology Docker Oberfläche nur eingeschränkte Einstellungsmöglichkeiten. Wenn man weitere Optionen nutzen möchte um z.B. auf Devices der NAS, wie z.B. ein ZWAVE oder ZIGBEE USB Stick zuzugreifen kommt man nicht um die manuelle Erstellung einer Docker Instanz herum. Auch kann ich so, einen DNS Server, feste IP Adresse und festen Hostnamen dem Docker Container mitgeben.

Docker Container mit Option Device

# Docker Container Name iobroker-new 
# Hostname des Containers: iobroker-test
# IP-Adresse von iobroker-test = 192.168.20.82
# DNS Server = 192.168.20.80
# DNS Search = stueben.local
# Eintrag in /etc/hosts : 192.168.20.80 nas nas.stueben.local
# Zugriff auf USB Device /dev/ttyACM0
# Docker Image: buanet/iobroker:latest


docker run -d --name iobroker-new --restart=always --hostname=iobroker-test --ip 192.168.20.82 --dns=192.168.20.80 --dns-search=stueben.local --add-host="nas nas.stueben.local:192.168.20.80" --net=mac0 --device=/dev/ttyACM0 -v /volume1/docker/iobroker-test/opt/iobroker:/opt/iobroker -it buanet/iobroker:latest

Nachteil ist, sollte sich der Devicename ändern z.B. von /dev/ttyACM0 nach /dev/ttyACM1 läßt sich der Docker Container nicht mehr starten. Mit der Option privileged statt device kann man alle Devices der NAS dem Docker Container bekanntgeben. Das kann man über die Synology Docker Oberfläche einstellen. Ich persönlich würde aber davon abraten, da der Docker Container damit weitereichende Berechtigungen auf der NAS hat und auf alle Devices zugreifen kann.

# Docker Container Name iobroker-new  
# Hostname des Containers: iobroker-test 
# IP-Adresse von iobroker-test = 192.168.20.82 
# DNS Server = 192.168.20.80 
# DNS Search = stueben.local 
# Eintrag in /etc/hosts : 192.168.20.80 nas nas.stueben.local 
# Docker Image: buanet/iobroker:latest


docker run -d --name iobroker-new --restart=always --hostname=iobroker-test --ip 192.168.20.82 --dns=192.168.20.80 --dns-search=stueben.local --add-host="nas nas.stueben.local:192.168.20.80" --net=mac0 --privileged -v /dev/bus/usb:/dev/bus/usb -v /volume1/docker/iobroker-test/opt/iobroker:/opt/iobroker -it buanet/iobroker:latest

 

 

 

ioBroker im Docker auf der Synology DiskStation im gleichen Subnet

eingetragen in: Docker, ioBroker, Synology 3

Um Docker auf der Synology NAS zu installieren gibt es von Andre Buanet ein Docker Paket. Die Installation habe ich wie hier auf https://buanet.de/2017/09/iobroker-unter-docker-auf-der-synology-diskstation/ beschrieben vorgenommen.  Ich habe aber ein paar kleine Änderungen vorgenommen damit ich den Bonjour Dienst im Docker Container parallel zu dem auf der Synology NAS laufen lassen kann.  Auch kann man mit der Lösung unten, mehrere ioBroker Instanzen laufen lassen, die alle dann unter Apple Homekit sichtbar sind.

Dafür darf der ioBroker Container nicht im Host Modus gestartet werden. Der NET (Bridge) Modus geht leider auch nicht, da die vergebene IP Adresse aus einem anderen Subnet ist (172.17.0.0) ist. Damit funktioniert Apple Homekit / Bonjour nicht mehr.
Aus diesem Grund muss ein MACVLAN angelegt werden (Mit Macvlan ist es möglich einer Netzwerkschnittstelle mehrere virtuelle Schnittstellen mit einer eigenen MAC Adresse zuzuweisen). Leider bietet Synology diese Option über die Docker Oberfläche nicht an.
Also mit SSH auf der NAS als root anmelden und folgenden Befehl ausführen:

docker network create -d macvlan --subnet=192.168.20.0/24 --gateway=192.168.20.40 --ip-range=192.168.20.80/28 --aux-address 'host=192.168.20.80' -o parent=eth0 mac0

Die IP Adresse meiner NAS ist 192.168.20.30 das dazugehörige Subnetz ist 192.168.20.0/24. Mit dem Befehl oben habe ich eine „MACVLAN Schnittstelle“ in Docker im Subnet 192.168.20.80/28 angelegt. In diesem Subnet werden IP Adressen von 192.168.20.80 bis 192.168.20.95 vergeben (http://www.subnet-calculator.com/cidr.php).

Dieser Bereich sollte beim eigenen DHCP Server ausgeschlossen werden um nicht doppelte IP Adressen zu vergeben.
In Docker sehe ich jetzt nun den Eintrag mac0 unter Netzwerk.

 

Also nächstes den Docker Container buanet/iobroker installieren und anders als in der Anleitung beschrieben in den erweiterten Einstellungen unter Netzwerk den Netzwerknamen mac0 auswählen.

Jetzt kann der Container gestartet werden und sollte eine IP Adressen zwischen 192.168.20.81 bis 192.168.20.95 erhalten. (Die IP Adresse 192.168.20.80 wurde mit dem Parameter –aux-address ‚host=192.168.20.80‘ ausgeschlossen).
Nun solle man ioBroker mit http://192.168.20.x:8081 von außen erreichen. Jetzt gibt es leider noch 2 Probleme. Einmal ist der DNS Server im Docker Container verkehrt und keine Namen auflösen und man kann aus dem Docker Container nicht die NAS erreichen und umgekehrt.
Folgendermaßen kann man das Problem lösen! Dafür wieder mit SSH auf der NAS als root anmelden und folgende Befehle ausführen:

# Virtuelles Netzwerk Device mac1 anlegen
ip link add mac1 link eth0 type macvlan mode bridge
ip addr add 192.168.20.80/32 dev mac1
ip link set mac1 up
ip route add 192.168.20.80/28 dev mac1

Somit ist der Docker ioBroker Container nun auch von der NAS aus ansprechbar. Aus dem Docker Container ist die NAS über die zusätzliche IP Adresse 192.168.20.80 zu erreichen. Leider sind die Einstellungen nach jedem reboot der NAS weg und müssen neu angelegt werden. Ich habe mir ein kleines sh Skript erstellt, welches bei jedem Start der NAS über den Synology Aufgabenplaner ausgeführt wird.

Nun noch das Problem mit dem DNS Server bereinigen. Dafür im ioBroker Docker Container ein Terminal öffnen. Nun als erstes einmal folgenden Befehl durchführen:

echo "nameserver 8.8.8.8 "> /etc/resolv.conf

Damit wurde der DNS Server mit der IP-Adresse 8.8.8.8 eingerichtet. Leider wird der Eintrag beim jedem reboot des ioBroker Docker Containers überschrieben. Nun schnell noch folgende Befehle ausführen um das System auf den neusten Stand zu bringen und den Editor vi zu installieren.

apt-get update
apt-get upgrade
# Editor VI installieren
apt-get install vim
apt-get install net-tools
apt-get install dnsutils
# Für Webcam Einbindung bei iobroker.yahka
apt-get install ffmpeg

# Zeitzone geradeziehen
cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime

So jetzt nun noch das Startskript anpassen, damit der Nameserver bei jedem Neustart des Container überschrieben wird. Dafür im Docker Container mit dem Editor vi das Skript /opt/scripts/iobroker_startup.sh um folgende Einträge am Anfang ergänzen:

#!/bin/sh

# Ergänzung - Anfang
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "192.168.20.80 nas nas.mydomain.local" >> /etc/hosts
# Ergänzung - Ende

cd /opt/iobroker

# ...

Jetzt den Container neu starten. Übrigens die Migration der „alten“ ioBroker Docker Installation in den neuen Container war total unproblematisch. Dafür habe ich das /opt/iobroker Verzeichnis kopiert. Vorher hatte ich die ioBroker / ioBroker Admin Versionen auf die gleiche Versionsnummern hochgezogen.

Falls Ihr ein Bond am Laufen habt oder Open vSwitch nutzt dann müsst Ihr als Device bondX (X = 0,1,2,…), oder ovs_ethX (X = 0,1,2,…) statt ethX nutzen.

Leider muss das MACVLAN bei jedem Neustart der Synology NAS neu eingerichtet werden. Aus diesem Grund habe ich eine kleines Skript erstellt, Dieses rufe ich im Aufgabenplaner (Systemsteuerung -> Aufgabenplaner) alle 5 Minuten als Benutzer root auf:

#!/bin/sh

if ip link | grep "mac1@eth0" > /dev/null; then

 echo "Device mac1 existiert"

else

 echo "Device mac1 anlegen"
 ip link del mac1
 ip link add mac1 link eth0 type macvlan mode bridge
 ip addr add 192.168.20.80/32 dev mac1
 ip link set mac1 up
 ip route add 192.168.20.80/28 dev mac1

fi

 

Internet of Things – ioBroker

eingetragen in: ioBroker 3

Wozu benötige ich etwas wie Internet of Things (IoT)

Plan war es unser Haus mit Heizungsthermostaten die ich online per App über das Smartphone steuern kann aufzurüsten. Da ich die Lupusec XT2+ Alarmanlage besitze, in der man auch Smarthomekomponenten schalten kann, habe ich mir passend Steckdosen und Heizungsthermostaten von Lupus bestellt. Die Steckdosen sind super, aber mit den Thermostaten war ich nicht so zufrieden und habe diese zurückgeschickt. Aber was nun, Thermostaten von anderen Herstellen bestellen und diese mit einer weiteren App schalten? Solange die Fenster offen sind sollen die Heizungsthermostaten die Temperatur automatisch runterregeln.  Aber wie soll das funktionieren mit Türkontakten von Lupusec und Heizungsthermostaten von einem anderen Hersteller? Wie sollen die Thermostaten wissen, wann die Fenster offen sind? Ich hatte kurz mit dem Gedanken gespielt, die Lupusec Alarmanlage zu verkaufen und stattdessen mir das Smarthomesystem von Homematic zuzulegen. Diese hat tolle Smarthomekomponenten für einen guten Preis. Aber als Alarmanlage kommt die Homematic für mich überhaupt nicht in Frage.

Jetzt stand ich vor dem Problem, Lupusec als super Alarmanlage behalten und Homematic mit tollen Smarthomekomponenten zuzulegen. Aber wie kombiniere ich Beides miteinander ohne mit mehren Apps zu arbeiten.

Durch Zufall bin ich über das Thema IoT (Internet of Things) gestolpert. IoT Lösungen wie FHEM, OpenHAB und ioBroker können Smarthomekomponenten verschiedener Anbieter miteinander verknüpfen. Ich habe mir alle drei Lösungen angeschaut. Dabei gefiel mir ioBroker am besten, da es auf nodejs aufbaut und Betriebssystem unabhängig ist. ioBroker kann man auf einem Raspberry, Windows, Mac, Unix oder in einem Docker Container auf einer Synology NAS installieren. Die ioBroker Oberfläche wird über einen Webbrowser wie z.b. Chrome aufgerufen.

Da ich noch einen Raspberry PI3 für ca. 35 EUR herumliegen hatte, habe ich ioBroker dort testweise installiert. Linux Kenntnisse sind hilfreich.

Ein ioBroker Testsystem zum auszuprobieren kann man über http://iobroker.click/ aufrufen.

Erste Schritte mit ioBroker

Eine Installationsanweisung wie man ioBroker installiert findet man für die verschiedenen Plattformen hier. Ist die Installation abgeschlossen, dann ruft man die Admininstrationsoberfläche über den Webbrowser mit http://<IP-raspbbery>:8081 auf (Bsp.: http://192.168.20.82:8081).

Die drei wichtigsten Bereiche in der ioBroker Adminoberfläche sind:

  • Adapter (verschieden Komponenten von Herstellern, wie z.B. Phillips HUE, Lupusec, Homematic, …., Stand Juni 2018 gibt es über 200 Adapter)
  • Instanzen (Instanz eines Adapters, erst dann kann man mit einem Adapter arbeiten)
  • Objekte (Objekte sind Geräte (Devices) von den Adpater-Instanzen und Datenpunkte wie z.B. Soll Temperatur vom Wohnzimmer Heizungsthermostaten. Der Status der Datenpunkte können gelesen und geändert werden.)

Hier ein Beispiel mit dem Lupusec Adapter. Auf dem Reiter Objekte kann mit status_ex die Lupusec Funksteckdose an und ausgestellt  bzw. den Status der Steckdose abgefragt werden, auch wenn diese über die Lupsusec App und nicht über ioBroker geschaltet wurde.

Jetzt kann man verschiedene Objekte voneinander abhängig schalten. Dieses geht für den der programmieren kann mit Javascript. Die die nicht programmieren können oder wollen steht die Blocksprache Blocky zur Verfügung.

In dem Beispiel unten, wird die Steckdose angeschaltet (true), sobald die Haustür aufgeht (Türkontaktstatus true). Sobald die Haustür geschlossen wird (Türkontaktstatus false) wird die Steckdose ausgeschaltet (false).

Wer ein iPhone besitzt kann seine ganzen Komponenten auch darüber steuern. Dafür muss der Apple Homekit Adapter installiert werden.

ioBroker bietet auch einen grafischen Editor an um eigene Oberflächen zum Steuern von Geräten zu erstellen. Programmierkenntnisse sind dafür nicht notwendig.

1 2 3 4 5