LogoControl mit Nginx als Webserver

Achtung: Seite noch in Arbeit!
Diese Anleitung ist vermutlich nicht vollständig und bedarf weiterer Überarbeitung. Mutige dürfen sich dennoch daran ausprobieren und Feedback geben was fehlt/falsch ist.

Warum überhaupt nginx?

Diese Anleitung richtet sich vorrangig an Nutzer die LogoControl unter Linux betreiben und Probleme mit dem HTTPS-Webservice haben. Unter Linux kommt das Mono-Framework zum Einsatz welches gerade im Bereich TLS-Stack einige, naja sagen wir mal „Unzulänglichkeiten“ aufweist. Zum einen fehlte bislang die Unterstützung für TLS1.2 (was seit Herbst 2016 nun endlich, wenn auch nicht standardmäßig aktiv, nachgeliefert wurde) und für neuere Cipher-Suites, zum anderen gab es teils nervige Bugs, wie z.B. der nicht abschaltbare Request nach Client-Zertifikaten beim TLS-Handshake. Dazu ist die Implementierung nicht gerade performant, was sich auf einem Raspi durchaus bemerkbar auswirkt (unter Windows ist von diesen Problemen nichts zu spüren). Daher hatte ich schon länger damit experimentiert den HTTPS-Teil von LogoControl abzuschalten und durch eine alternative Lösung zu ersetzen: nginx!

Nginx ist ein Webserver, welcher auch als Reverse Proxy eingesetzt werden kann. Vereinfacht gesagt wird nginx vor LogoControl geschaltet. In LogoControl ist dann nur noch der normale HTTP-Webservice ohne Benutzeranmeldung aktiviert. Um HTTPS und Benutzerauthentifizierung über Basic-Auth kümmert sich dann nginx und leitet nach erfolgreicher Authentifizierung die Requests einfach an LogoControl weiter.

nginx hat noch viele andere Vorteile, z.B. können hinter dem Reverse Proxy diverse Webdienste im heimischen Netz (NAS, Fritz.box, LogoControl, FHEM, eigener Webserver, SSH…) unter ein und demselben Port mit einheitlichem Zertifikat nach außen veröffentlicht werden. Wer dann noch eine eigene Domain besitzt kann per CName-Eintrag diese auf den heimischen Router weiterleiten und beliebige Subdomains wie nas.meinedomain.de, logocontrol.meinedomain.de etc. anlegen. Mit der ensprechenden nginx Konfiguration verteilt dieser dann die Anfragen anhand der Subdomain im heimischen Netz an die verschiedenen Geräte. Allerdings will ich hier nicht weiter darauf eingehen und auch keinen Support anbieten. Ich möchte nur die Möglichkeiten aufzeigen, für Details dazu bemüht bitte Google!

Installieren

sudo apt-get update
sudo apt-get install nginx

Version ausgeben

nginx -v

Zertifikat erzeugen

cd /etc/nginx
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

Basic Auth file erzeugen

sudo sh -c „echo -n ‚your_username:‘ >> /etc/nginx/.htpasswd“
sudo sh -c „openssl passwd -apr1 >> /etc/nginx/.htpasswd“

nginx konfigurieren

sudo nano /etc/nginx/sites-enabled/default

Folgende Konfiguration übernehmen:

# Default server configuration
#
server {
        listen 443 ssl;
        server_name logocontrol;

        ssl_certificate /etc/nginx/logocontrol.crt;
        ssl_certificate_key /etc/nginx/logocontrol.key;

        auth_basic "Please log in for using LogoControl";
        auth_basic_user_file /etc/nginx/.htpasswd;


        location / {
                proxy_pass                            http://localhost:8088/;
                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-Scheme   $scheme;

                # Time to wait for LogoControl to answer a request, at least 60
                # sec are needed for Long-Polling of /events webservice
                proxy_read_timeout 90;

                # Bypass HTTP Basic Auth for CORS Preflight requests
                if ($request_method = OPTIONS) {
                        add_header Content-Length 0;
                        add_header Content-Type text/plain;
                        add_header Access-Control-Allow-Methods $http_access_control_request_method;
                        add_header Access-Control-Allow-Origin $http_origin;
                        add_header Access-Control-Allow-Headers $http_access_control_request_headers;
                        return 200;
                }
        }
}

nginx Konfiguration neu laden

sudo nginx -s reload