Natürlich gibt es – wie immer – mehrere Herangehensweisen, um Jarvis von Extern zu erreichen. Ich selbst benutze sowohl die Variante per VPN (Wireguard) als auch die Variante mit einem Reverse-Proxy, der bei mir allerhand Aufgaben übernimmt.
Eins vorab: Eine Jarvis-Installation “einfach so” freizugeben ist fahrlässig und kann im schlimmsten Falle bedeuten, das jemand von außerhalb die Kontrolle über Dein Smart-Home übernimmt!
Installation des Apache2 Reverse-Proxy
Zuvor bringen wir das System auf den aktuellen Stand:
apt update && apt upgrade -y
Danach installieren wir Apache2
sudo apt install -y apache2
Sobald Apache installiert wurde, bitte einige Anpassungen vornehmen:
Module aktivieren
sudo -s a2enmod rewrite headers env dir mime
Modul anpassen
nano /etc/apache2/mods-available/http2.conf
und diesen Text vor dem Inhalt einfügen
# mod_http2 doesn't work with mpm_prefork <IfModule !mpm_prefork> Protocols h2 h2c http/1.1 H2Direct on H2StreamMaxMemSize 5120000000 [...]
Neustart von Apache2
systemctl restart apache2.service
Standardseite von Apache kopieren und deaktivieren
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-jarvis.conf
a2dissite 000-default.conf
vHost anpassen
nano /etc/apache2/sites-available/001-jarvis.conf
Datei öffnen, folgenden Inhalt anlegen und die hervorgehobenen Zeilen anpassen
<VirtualHost *:80> ServerName jarvis.domain.de ServerAlias jarvis.domain.de ServerAdmin jarvis@domain.de ErrorLog /var/log/apache2/jarvis_error.log CustomLog /var/log/apache2/jarvis_access.log combined RewriteEngine on RewriteCond %{SERVER_NAME} =jarvis.domain.de RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost>
vHost aktivieren
a2ensite 001-jarvis.conf && systemctl restart apache2.service
Certbot installieren und Let’s Encrypt Zertifikate beantragen
Bevor Du den nächsten Schritt ausführst, solltest Du sicherstellen, das der Port 80 und 443 von deinem Router auf den Server durchgereicht werden, da der Certbot von Let’s Encrypt eine live Prüfung vornimmt und den Apache-Server erreichen muss.
apt install -y certbot python3-certbot-apache certbot --apache
Nachdem das Zertifikat erstellt wurde, kannst du die Datei anpassen, damit sie für Jarvis funktioniert.
Zuerst legen wir eine Sicherheitskopie für den Fall der Fälle an.
mv /etc/apache2/sites-available/001-jarvis-le-ssl.conf /etc/apache2/sites-available/001-jarvis-le-ssl.conf.bak
Jarvis vHost mit SSL und Passwort Schutz
Datei öffnen, folgenden Inhalt anlegen und die hervorgehobenen Zeilen anpassen.
nano /etc/apache2/sites-available/001-jarvis-le-ssl.conf
<IfModule mod_ssl.c> SSLUseStapling on SSLStaplingCache shmcb:/var/run/ocsp(128000) <VirtualHost *:443> SSLCACertificateFile /etc/letsencrypt/live/jarvis.domain.de/fullchain.pem SSLCertificateFile /etc/letsencrypt/live/jarvis.domain.de/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/jarvis.domain.de/privkey.pem ####################################################################### # For self-signed-certificates only! # SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem # SSLCACertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem # SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key ####################################################################### Protocols h2 h2c http/1.1 Header add Strict-Transport-Security: "max-age=15552000;includeSubdomains" ServerAdmin jarvis@domain.de ServerName jarvis.domain.de ServerAlias jarvis.domain.de SSLEngine on SSLCompression off SSLOptions +StrictRequire SSLProtocol -all +TLSv1.3 +TLSv1.2 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 SSLHonorCipherOrder off SSLSessionTickets off ServerSignature off SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors off SSLOpenSSLConfCmd Curves X448:secp521r1:secp384r1:prime256v1 SSLOpenSSLConfCmd ECDHParameters secp384r1 LogLevel warn ErrorLog /var/log/apache2/jarvis_error.log CustomLog /var/log/apache2/jarvis_access.log combined ProxyPassMatch (.*)(\/jarvis-socket)$ "ws://10.0.0.1:8400/$1$2" ProxyPass / http://10.0.0.1:8400/ ProxyPassReverse / http://10.0.0.1:8400/ <Proxy *> Order deny,allow Allow from all AuthType Basic AuthName "Password Required" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Proxy> </VirtualHost> </IfModule>
In den Zeilen 39, 40 und 41 gibst Du die IP Deines Jarvis an, inklusive des Ports von 8400 – dies ist der direkte Port von Jarvis und umgeht den Verkehr über den Webserver des ioBroker.
In Zeile 39 wird der sogenannte WebSocket von Jarvis angesprochen. Dies ist eine “Standleitung”, die nicht abbricht – so werden alle Informationen (Status-Änderungen usw) bi-direktional ausgetauscht. Hier kannst Du auch gerne wss (WebSocketSecure) verwenden, welches aber nicht nötig ist, da der Reverse-Proxy innerhalb deines Netzwerk auch prima ohne SSL oder WSS auskommt. Der Browser wirft zwar einen Fehler, das er nicht zu wss:// verbinden kann – dies kann aber getrost ignoriert werden.
Benutzer für Jarvis im Apache anlegen
sudo htpasswd -c /etc/apache2/.htpasswd <Benutzer>
Hier wirst Du nach einem Passwort und der Wiederholung des Passworts gefragt.
Für jeden weiteren Benutzer, bitte nicht das Argument -c angeben, um die Datei nicht zu überschreiben:
sudo htpasswd /etc/apache2/.htpasswd <AndererBenutzer>
Sicherheit erhöhen und aktivieren
Hiermit erstellen wird einen 4096 Bit langen Schlüssel. Es kann bei einem Raspberry Pi in etwa 6 – 10 Minuten in Anspruch nehmen. Bei schnelleren System geht dies natürlich binnen Minuten. Auch hier bitte wieder die hervorgehobenen Zeilen anpassen.
openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096 cat /etc/ssl/certs/dhparam.pem >> /etc/letsencrypt/live/jarvis.domain.de/fullchain.pem
Nun kann der Apache neu gestartet werden.
systemctl restart apache2.service
Jarvis über https aufrufen
Nachdem Du nun alle Einstellungen getätigt hast, kannst natürlich auch Jarvis von extern erreichen. Dies geschieht mit:
https://jarvis.domain.de
Nach dem Eingeben von Benutzername und Passwort wird – wenn alles richtig eingestellt und konfiguriert wurde – Jarvis geladen und Du kannst es genauso bedienen, wie in deinem Heimnetz.