Benutzer der XML API auf der Homeatic Zentrale (CCU) hatten ziemlich sicher bereits die selbe Idee wie ich: Unterwegs komfortabel die Heizung der Wohnung mit dem Handy zu regulieren. Problem ist jedoch die Sicherheit: Die XML API bietet keinerlei Authentifizierung an. Der erste Versuch war das absichern mit VPN. Der Komfort bleibt hier jedoch etwas auf der Strecke, da man mit dem Handy immer zuerst eine VPN Verbindung nach Hause aufbauen muss. Einfacher geht es natürlich direkt per https (Dank DynDNS Dienst der FritzBox).
Die Autorisierung habe ich über einen Reverse Proxy in Form von NGINX auf meiner qnap Nas realisiert. Dieser soll eine Passwort Abfrage vor die API setzen. Anstelle einer NAS würde sich hier natürlich auch ein Raspberry PI anbieten. Längerfristig will ich zwar die CCU durch die NAS komplett ersetzen, dazu fehlt mir aber erst einmal die Zeit.
Was ist nun zu tun:
Über die APP Manager auf der Administrations- Oberfläche installiert man zuerst das NGINX Paket. Nun verbindet man sich per SSH auf die NAS und wechselt dort in das NGINX Verzeichnis: /share/CACHEDEV1_DATA/.qpkg/Nginx/nginx. Direkt dort habe ich eine Passwort Datei mit dem Namen htpasswd angelegt (vim). Deren Inhalt ist eine Liste mit Usernamen und gehashten Passworte die auf diversen Websites oder mit dem Kommando htpasswd erzeugt werden können. Leider nur nicht direkt auf der Nas:
bk@klapppower:~$ htpasswd -n MeinUser New password: Re-type new password: MeinUser:$apr1$WUaw0QtE$CHHlgxVXGXavjwBeFHME60 bk@klapppower:~$
Der zweite Schritt ist nun die NGINX Konfiguration. Im Unterverzeichnis conf befindet sich die Datei nginx.conf.
[/share/CACHEDEV1_DATA/.qpkg/Nginx/nginx/conf] # ll drwxr-xr-x 2 admin administ 4.0k Dec 25 22:16 ./ drwxr-xr-x 12 admin administ 4.0k Dec 14 20:27 ../ -rw-r--r-- 1 admin administ 1.0k Aug 22 13:33 fastcgi.conf -rw-r--r-- 1 admin administ 1.0k Aug 22 13:33 fastcgi.conf.default -rw-r--r-- 1 admin administ 1.1k Aug 22 13:33 fastcgi_params -rw-r--r-- 1 admin administ 964 Aug 22 13:33 fastcgi_params.default -rw-r--r-- 1 admin administ 2.8k Aug 22 13:33 koi-utf -rw-r--r-- 1 admin administ 2.2k Aug 22 13:33 koi-win -rw-r--r-- 1 admin administ 3.9k Aug 22 13:33 mime.types -rw-r--r-- 1 admin administ 3.9k Aug 22 13:33 mime.types.default -rw-r--r-- 1 admin administ 2.0k Dec 14 20:35 nginx.conf -rw-r--r-- 1 admin administ 2.6k Aug 22 13:33 nginx.conf.default -rw-r--r-- 1 admin administ 596 Aug 22 13:33 scgi_params -rw-r--r-- 1 admin administ 596 Aug 22 13:33 scgi_params.default -rw-r--r-- 1 admin administ 623 Aug 22 13:33 uwsgi_params -rw-r--r-- 1 admin administ 623 Aug 22 13:33 uwsgi_params.default -rw-r--r-- 1 admin administ 3.5k Aug 22 13:33 win-utf [/share/CACHEDEV1_DATA/.qpkg/Nginx/nginx/conf] #
In dieser gibt es einen Bereich der mit Server { eingeleitet wird. Darin habe ich einen neunen location Bereich eingeleitet.
server { listen 81 ssl; server_name localhost; charset utf-8; ... location /homematic { auth_basic "Restricted"; auth_basic_user_file /share/CACHEDEV1_DATA/.qpkg/Nginx/nginx/htpasswd; charset iso-8859-1; proxy_pass https://homematic/; } } }
Wird die Adresse der nas anschließend gefolgt von /homeatic aufgerufen wird NGINX die Anfrage an die CCU umleiten.
Wesentlich sind die Parameter auth_basic_user_file welcher den Pfad zur zuvor erstellen Passwortdatei enthält, charset um Zeichensatz Probleme mit der API zu lösen und proxy_pass welcher die Adresse der CCU im Lokalen Netzwerk angibt.
Zuletzt muss noch nginx auf der NAS neu gestartet werden. Was dazu der vorgesehene Weg ist habe ich nicht recherchiert. Ich habe ihn einfach gekillt und neu gestartet:
[/share/CACHEDEV1_DATA/.qpkg/Nginx/nginx] # killall nginx [/share/CACHEDEV1_DATA/.qpkg/Nginx/nginx] # /usr/local/nginx/sbin/nginx [/share/CACHEDEV1_DATA/.qpkg/Nginx/nginx] #
Fertig.
Das ganze hatte bei mir etwa drei Monate funktioniert. Seit Dezember nicht mehr. Habe schon alles mögliche probiert, es geht einfach nicht. Wäre es möglich mir die ganze conf Datei zu senden oder zu posten. Dann kann diese nochmal prüfen.
Danke noch für die super Anleitung, hatte mir sehr geholfen.
Habe das gleiche ausprobiert, mit HTTP funktioniert es, mit HTTPS nicht. Ich vermute, das liegt am (self signed) Zertifikat auf der CCU.
Habe erfolglos auch folgende Parameter ausprobiert sowie das CCU Zertifikat auf der NAS gespeichert:
location / {
proxy_pass https://backend.server.ip/;
proxy_ssl_trusted_certificate /etc/nginx/sslcerts/backend.server.pem;
proxy_ssl_verify off;
… other proxy settings
https://serverfault.com/questions/341023/nginx-as-reverse-proxy-with-upstream-ssl
Statt Basic Auth sollte man Digest Auth nehmen (https://www.nginx.com/resources/wiki/modules/auth_digest/). Wenn jemand unverschlüsseltes Basic Auth mitliest, kommt derjenige trivial an Benutzername und Passwort (einfach base64 dekodieren). Bei Digest Auth (https://en.wikipedia.org/wiki/Digest_access_authentication – die deutsche Wiki ist hier eher schwach) ist das deutlich schwieriger, da alles durch MD5 geht und man zusätzlich noch einen Nonce (sich ändernder Zufallswert) hat. MD5 gilt zwar nicht mehr als sicher, aber der Angriff wird trotzdem recht aufwendig und Replay-Attacken sind dank des Nonce auch mehr möglich.