Also ich hab das jetzt erfolgreich eingerichtet, Eckpunkte:
- Fritzbox Portforwarding nur ipv6
- ReverseProxy Nginx auf eigenem Raspi, dieser macht eine Client-Zertifikat-Validierung
- Eigene domain via dynv6.com ... update mit ddclient
- Letsencrypt Zertifikat für meine Domain
- Client-Zertifikat für die Authentifizierung generiert und auf dem iphone unter Device Management installiert
Die obigen Eckpunkte beschreibe ich jetzt nicht bzgl. der Einrichtung, da gibt es genügend Anleitungen im Netz, hier nur das Wichtigste:
- Fritzbox, reine Freigabe auf die ipv6-Adresse des Raspi für die Ports 80 (wegen letsencrypt), 443 (ssl) und 900 (ssl)
- ReverseProxy, siehe unten. Hier hab ich etwas gekniffelt, bis ich eine Konfiguration hatte die nur auf meinem Domain-Namen das Zertifikat verwendet und auch den WebSocket-Upgrade richtig macht. Wer sich beim Handshake nicht mit dem richtigen SNI meldet, bekommt nur ein Dummy-Zertifikat. Das ist ein Versuch der Verschleierung des Hostnames, falls nur jemand die IPv6 in die Hände bekommt. Mehr aber auch nicht, könnt ihr auch weglassen.
- wer will, dass das auch aus dem lokalen Netz aufrufbar ist muss in der Fritzbox bei DNS-Rebind die eigene Domain als Ausnahme eintragen
Hier die Konfiguration für /etc/nginx/sites-available/
www.example.com:
Code: Alles auswählen
server {
root /var/www/html;
index index.html;
listen [::]:443 ssl ipv6only=on; # managed by Certbot
server_name www.example.com ; # managed by Certbot
if ($host != www.example.com ) {
return 404;
}
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
ssl_client_certificate /path/to/cert/ca.crt; # Path to your CA certificate for validating clients
ssl_verify_client optional;
location /openWB/ {
if ($ssl_client_verify != SUCCESS) {
return 403;
}
proxy_pass http://192.168.178.200/openWB/;
proxy_http_version 1.1;
proxy_set_header Host $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;
}
}
server {
root /var/www/html;
index index.html;
listen [::]:9001 ssl ipv6only=on;
server_name www.example.com ;
if ($host != www.example.com ) {
return 404;
}
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
ssl_client_certificate /path/to/cert/ca.crt; # Path to your CA certificate
ssl_verify_client optional;
location / {
if ($ssl_client_verify != SUCCESS) {
return 403;
}
proxy_pass http://192.168.178.200:9001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# Default server block to reject all other domains
server {
listen [::]:443 ssl default_server;
listen [::]:9001 ssl default_server;
server_name _;
ssl_certificate /path/to/cert/default_dummy/dummy.crt;
ssl_certificate_key /path/to/cert/default_dummy/dummy.key;
return 444;
}
server {
if ($host = www.example.com ) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen [::]:80 ;
server_name www.example.com ;
return 404; # managed by Certbot
}
Bin auf Feedback gespannt.