Liebe Kollegen!
Ich hatte (und habe noch immer) seit 2 Jahren einen Raspi mit OctoPrint im Einsatz, darauf läuft auch ein Webserver der auf das XS1 und etliche Wetterdaten zugreifen kann.
Dieser hat auch eine Kamera und kann mir ein mail mit einem Foto schicken wenn der Print fertig ist.
Egal, das ist nur die Vorgeschichte da ich die Daten nie wirklich über normales Port-Forwarding in die weite Welt schicken will hab ich mir vorgenommen dies über einen SSL-Zugriff einzurichten, damit nicht jeder gleich Passwörter oder sonstiges erschnüffeln kann.
Nun, ich hab mir letztes Jahr auch zwei Domain-Namen reserviert und eine davon mit Office 365 für meine Frau und mich verwendet, als Selbständiger und privat.
Seit einiger Zeit hab ich auch eine no-ip-Adresse über meine Fritz-Box eingerichtet aber all das noch nicht richtig genutzt (außer für VPN).
Da ich aber meinen Raspi überall mit Handy's oder Webbrowsern steuern will und mir einen neuen 3er zugelegt hab der zur Alarmanlage und Haussteuerung mutieren soll fing ich an mir verschiedene Möglichkeiten anzusehen wie ich das Netzwerk ausschließlich über https von außen betreten kann aber intern am Raspi verschiedene Services leider auch ohne SSL nutzen kann.
Von Octoprint kannte ich haproxy, eigentlich ein load-balancer für Server-Farmen der sehr klein ist und seit der Version 1.5.x (jetzt mit apt-get auf 1.5.8) auch SSL kann, und hab mal 'nen Versuch gestartet mit ihm ein SSL-Frontend zu generieren welches alle meine jetzigen Services (auch auch auf anderen Raspi's oder Services wie meinen NAS-Server) über's Web per SSL zu steuern.
Natürlich wollte ich auch offizielle SSL-Zertifikate damit sich die verschiedenen Web-Browser nicht aufregen wenn selbst kreierte verwendet werden.
Warum ich mich für haproxy entschieden habe kann im einem weiteren Eintrag gelesen werden den ich später anfügen werde wenn ich erkläre wie ich die verschiedenen Hauptseiten trennen kann.
Also hab ich losgelegt und mich zuerst bei StartSSL(startssl.com) einen account kreiert und mir das Zertifikat in den Browser installiert mit dem ich dann bei StartSSL selbst (GRATIS) SSL-Zertifikate ausstellen kann.
Für meine 2 Domains (nennen wir sich mein.com und dein.com) hab ich dann dort die Zertifikate generiert. Das geht für max 5 sub-domains ("http://www.mein.com", "blog.mein.com", "nas.mein.com", ...) wobei die erste die Hauptdomäne ist. Ich verwendete das von Startcomtool um den request und key zu generieren, den key bitte als mein.com.key abspeichern!
Man bekommt dann eine Zip-Datei mit Zertifikaten von StartSSL, http://www.mein.com.zip wo weitere Zip's enthalten sind ( für Apache, IIS, NGinx) eines als OtherServer.zip.
In diesem befinden sich
- 1_Intermediate.crt
- 2_www.mein.com.crt
- root.crt
die ersten beiden hab ich dann auf den Raspi in ein temporäres Verzeichnis kopiert (hab auch Samba am Raspi) und auch das main.com.key vom vorigen Schritt mit dem Smartcomm-Tool.
Auf dem Raspi hab ich dann
ausgeführt. Wichtig ist die Reihenfolge, hab lange gebraucht um nach der Ursache zu Googeln da haproxy das PAM-file sonst nicht akzeptiert hatte.
Danach hab ich mit
Mit der 2. Domain ebenso verfahren und das pem2 (ich hab's so genannt damit ich weiß dass ich es selbst durch cat generiert habe und es nicht eines von sonstwem ist) auch in den /etc/ssl/haproxy folder kopieren. Damit kann mann auch mehrere Sites mit einem Proxy abdecken.
Auf rem Router (für mich die Fritzbox) sollte eine Portfreigabe von 443-443 auf 443 vom Raspi eingerichtet werden, natürlich könnten die Ports auch geändert werden aber ich hab's so gelassen da meine links dann intern und extern funktionieren.
So, jetzt wird haproxy installiert und konfiguriert:
In die cfg-Datei hab ich am Ende (noch in der default-Sektion) folgendes angefügt:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
option http-server-close
option forwardfor
maxconn 2000
timeout connect 5s
timeout client 15min
timeout server 15min
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
stats enable
stats auth haproxy:haproxy
stats uri /haproxyStats
frontend https-in
bind *:80
bind *:443 ssl crt /etc/ssl/haproxy
mode http
# Define hosts
acl host_mein hdr(host) -i mein.com
acl host_dein hdr(host) -i dein.com
# Routings zu speziellen services
use_backend motion if { path_beg /motion }
use_backend nodered if { path_beg /nodered }
## figure out which one to use
use_backend mein if host_mein
use_backend dein if host_dein
default_backend mein
backend mein
# mein web server auf dem Raspi, läuft unter node.js
redirect scheme https if !{ ssl_fc }
option httpclose
option forwardfor
server node 127.0.0.1:3000
backend nodered
# damit kann ich node-red jetzt über SSL umkonfigurieren
reqrep ^([^\ ]*)\ (/nodered/?)(.*) \1\ /\3
option httpclose
server node-red 127.0.0.1:1880
backend motion
# damit kann ich mir den lifestream von motion und der angeschlossenen Raspi-Cam ansehen.
reqrep ^([^\ ]*)\ (/motion/?)(.*) \1\ /\3
timeout server 30s
server webcam1 127.0.0.1:8081
backend dein
# optionen ...
server deinserver interner.IP:port
Alles anzeigen
So, das wars
Nach dem Ändern der cfg-Datei halt wieser
Wenn was im CFG-file nicht stimmt dann startet er eh nicht.
In der gezeigten Konfiguration kann ich intern über normales http und extern nur über ssl (da ich nur portforwarding für ssl eingerichtet habe) auf die services zugreifen.
Da ich kein Spezialist von SSL oder hproxy bin kann ich euch nur bitten zu Googeln um mehr zu erfahren, ich hab mir das aus 10 verschiedenen Anleitungen zusammengetragen bis es funktionierte.
Viel Spaß
Frank