openHAB – Zugriff über HTTPS absichern

Wer sein Zugriff auf openHAB etwas sicherer gestalten möchte, kann dies mit Hilfe von HTTPS tun.
Dadurch wird der gesamte Netzwerkverkehr verschlüsselt übertragen.
Dies muss zwar für das Heimnetzwerk nicht unbedingt sein, kann aber die allgemeine Sicherheit deutlich erhöhen.
Wer openHAB aus dem Internet zugänglich machen möchte (was nicht zu empfehlen ist!), sollte dies ohnehin tun.
openHAB selbst ist schon so konfiguriert, damit ein Zugriff via HTTPS möglich ist.
Dazu öffnet openHAB den Port 8443.
Es gibt aber zwei Nachteile, welche mit im laufenden Betrieb des öfteren aufgefallen sind:
1. Das Backend von openHAB reagiert teilweise nicht über Verbindungen per HTTPS, Speichert Konfigurationen nicht oder loggt mich ständig aus.
2. Eingebettete Webseiten (z.B. Überwachungskameras, Webseiten, …) welche keine öffentlich beglaubigten Zertifikate haben, lassen in der Android-App eine Fehlermeldung statt die Seite erscheinen.

Die Erklärung für Punkt 2:
Android erlaubt den Zugriff auf eingebettete Inhalte nur mit gültigen / vertrauten Zertifikaten und die SSL-Verschlüsselung muss durchgängig sein.
Eine Abfrage, ob wir dem Zertifikat vertrauen, erscheint in der App nur für das Zertifikat für openHAB selbst.
Für eingebettete HTTPS-Inhalte kommt diese Meldung nicht. Es wird dann ein Zertifikatsfehler angezeigt.
Wird der Inhalt in openHAB per HTTP eingebunden und wir rufen openHAB per HTTPS auf, wird der HTTP-Inhalt nicht geladen!

Die Lösung für unsere Probleme: nginx als Proxy!

Mit nginx können wir ein HTTPS-Proxy installieren, welcher den Zugriff auf openHAB via HTTPS absichert.
HTTP-Inhalte können wir ebenfalls durch den Proxy schleußen, damit die Smartphone-Apps zufrieden sind.

Ein Hinweis:
Diese Anleitung basiert auf der offiziellen Anleitung von openHAB: Securing access to openHAB

Los gehts!


1. Ein selbst signiertes Zertifikat erstellen:

# openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/ssl/private/selfsigned.key -out /etc/ssl/certs/selfsigned.crt

» Gebe einfach irgendwelche Daten an. Diese müssen nicht stimmen.
» Gebe bei der Frage nach FQDN oder deinem Namen die IP oder Domain deines openHAB-Servers an

2. Installieren von nginx:

# apt install nginx -y

3. Entfernen der Standardkonfiguration:
HINWEIS: Wenn du bereits nginx im Einsatz hast, kannst du diese Schritt ggf. überspringen!

# rm /etc/nginx/sites-enabled/default

4. Neue openHAB-Konfiguration anlegen:

# nano /etc/nginx/sites-available/openhab

5. Folgenden Inhalt in diese Konfiguration schreiben und ggf. anpassen:

server {
    listen                          80;
    server_name                     192.168.1.100;
    return 301                      https://$server_name$request_uri;
}
server {
    listen                          443 ssl http2;
    server_name                     192.168.1.100;

    add_header 'Access-Control-Allow-Origin' '*' always;
    add_header 'Access-Control-Allow_Credentials' 'true' always;
    add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always;
    add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always;

    add_header Set-Cookie X-OPENHAB-AUTH-HEADER=1;

    ssl_certificate                 /etc/ssl/certs/selfsigned.crt;
    ssl_certificate_key             /etc/ssl/private/selfsigned.key;
    add_header                      Strict-Transport-Security "max-age=31536000";

    location / {
        proxy_pass                              http://localhost:8080/;
        proxy_set_header Host                   $http_host;
        proxy_set_header X-Real-IP              $remote_addr;
        proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto      $scheme;
        proxy_set_header Upgrade                $http_upgrade;
        proxy_set_header Connection             "Upgrade";
        proxy_set_header Authorization          "";
        satisfy                                 any;
        allow                                   192.168.1.0/24;
        allow                                   127.0.0.1;
        deny                                    all;
    }

}

listen 80 => Falls Port 80 belegt ist, auf ein anderen abändern. Bei einer Standardinstallation von oenHAB ist dieser NICHT belegt
listen 443 ssl http2 => Falls Port 443 belegt ist, auf ein anderen abändern. Bei einer Standardinstallation von openHAB ist dieser NICHT belegt
server_name 192.168.1.100 => Gegen die IP oder Domain deines openHAB-Servers ändern
ssl_certificate /etc/ssl/certs/selfsigned.crt => Pfad zum Zertifikat anpassen
ssl_certificate_key /etc/ssl/private/selfsigned.key => Pfad zum Schlüssel anpassen
proxy_pass http://localhost:8080/ => Falls du den Port von openHAB geändert hast, pass diesen hier an, ansonsten lass es einfach so
allow 192.168.1.0/24 => Pass die Adresse auf dein Heimnetzwerk an

Speichere alles ab

6. Die Konfiguration aktivieren:

# ln /etc/nginx/sites-available/openhab /etc/nginx/sites-enabled/

7. Konfiguration prüfen:

# nginx -t

8. nginx einmal neu starten, damit die Konfiguration übernommen wird
service nginx restart

9. Rufe nun openHAB via HTTPS auf!

https://192.168.1.100 ODER https://deine-domain.de

Verbinde deine Smartphone-Apps nun ebenfalls neu und achte darauf, das der korrekte Port aufgerufen wird.
Ja, es wird eine Zertifikatsmeldung erscheinen, dass das Zertifikat selbst signiert und damit nicht vertrauenswürdig ist.
Dies ist ok und kann im Browser als auch in der App bestätigt werden.

Solltest du dein Zertifikat mit z.B. Lets Encrypt erstellen, wird die Warnung nicht erscheinen.


Wie mach ich das jetzt mit internen Dienste, die via HTTP aufgerufen werden?

Um interne Dienste wie z.B. eine Überwachungskamera, andere Smart-Home-Geräte oder ein Webinterface deines NAS erreichbar zu machen, sollten wir auch einen Proxy-Server konfigurieren.
Somit wird die Verbindung bis zu openHAB hin voll verschlüsselt. Smartphone-Apps finden das gut und stellen daher die Seite problemlos dar.
Was nginx damit dann anstellt, interessiert die App nicht.
» Wenn du eine Seite einfach via HTTP einbindest und diese über die openHAB-App öffnest, wird dir nichts angezeigt. Der Inhalt bleibt einfach leer!

Dazu legen wir einfach eine weitere Konfiguration in nginx an und passen den Server einfach auf den gewünschten Dienst an, den wir anbinden möchten.
Wir müssen nur ein anderen Port anstatt 80 und 443 hinterlegen.
Wir benutzen auch das Zertifikat, welches wir gerade angelegt haben.
Diesem haben wir ja im Browser / in der App vertraut. Dadurch können wir die Seite gleich problemlos erreichen.

server {
    listen 1443 ssl http2;
    server_name 192.168.1.100;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass http://192.168.1.200:8091;}

        ssl_certificate /etc/ssl/certs/selfsigned.crt;
        ssl_certificate_key /etc/ssl/private/selfsigned.key;
}

listen 1443 ssl http2 => Einfach gegen ein anderen freien Port ändern
server_name 192.168.1.100 => Gegen die IP oder Domain deines openHAB-Servers ändern
ssl_certificate /etc/ssl/certs/selfsigned.crt => Pfad zum Zertifikat anpassen
ssl_certificate_key /etc/ssl/private/selfsigned.key => Pfad zum Schlüssel anpassen
proxy_pass http://192.168.1.200:8091 => Gegen die Domain oder IP deines gewünschten Dienstes abändern und bei Bedarf den Port mit angeben

Nun noch einmal nginx neu laden lassen und schon ist der Dienst über https://192.168.1.100:1443 oder deine-domain.de:1443 erreichbar.
Diese Adresse kannst du nun in dein openHAB-Dashbaord einbinden, damit die Inhalte sicher erreichbar sind und in der Smartphone-App auch geladen werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.