SSL-Zertifikat für die Verbindung zum Heimserver über socat

797
iYassin

Ich lasse Nextcloud zu Hause auf einem Raspberry Pi laufen. Es aktualisiert seine IPv6-Adresse mit einem Hostnamen beim DynDNS-Anbieter spDYN.de. Da mein Provider jedoch nur IPv6-Verbindungen anbietet (mithilfe von DS-Lite für IPv4), kann ich nur von anderen IPv6-Verbindungen direkt auf den Hostnamen zugreifen, und ich muss einen IPv4-IPv6-Postmapper verwenden, um eine Verbindung von IPv4-Netzwerken herzustellen.

Dies ist keine große Sache, wie meine Website auf einem Server gehostet wird, die sowohl IPv6 als auch IPv4 - Verbindungen hat, so habe ich socat nach diesem Tutorial meiner Website einen portmapper auf der Server - Hosting einzurichten, Routing einen bestimmten Port von meiner Website Domäne an Port 443 auf dem dynamischen DNS-Hostnamen. Dies funktioniert einwandfrei, verursacht jedoch ein Problem mit SSL-Zertifikaten:

Beim RasPi habe ich mit certbot ein "Let's encrypt" -Zertifikat für den dynamischen DNS-Hostnamen erstellt, der einwandfrei funktioniert und die Verbindung als gesichert angezeigt wird. Auf meinem Webserver habe ich auch ein ähnliches Zertifikat für die Domäne erstellt, die ich für den Portmapper verwende, der an sich funktioniert. Wenn ich jedoch über einen bestimmten, weitergeleiteten Port auf die Domäne zugreife, um auf das RasPi zuzugreifen, zeigt der Browser weiterhin die URL mit meiner Domäne an, er erhält jedoch das Zertifikat vom RasPi, das für den dynamischen DNS-Hostnamen ausgestellt wurde. Als Folge schlägt die Sicherheitsprüfung natürlich fehl, da das Zertifikat für die "falsche" Domäne ausgestellt wird. Ich habe bereits versucht, ein Zertifikat auf meinem RasPi für meine Domain auszustellen, aber es wird nicht angezeigt, dass ich "nicht autorisiert" bin.

Wie kann ich dieses Problem lösen? Wo muss ich welche Art von Zertifikat einrichten?

3

1 Antwort auf die Frage

2
Scruffy

Um Zertifikatfehler zu vermeiden, benötigen Sie das pi, um ein Zertifikat zu senden, das der verwendeten Domäne entspricht. Dafür gibt es zwei Ansätze:

  1. Verwenden Sie ein Zertifikat für beide Domänen, das sowohl auf dem Pi-Server als auch auf dem Hauptserver installiert ist. Es spielt keine Rolle, welche Domäne der Client in seiner Abfrage verwendet, das Zertifikat stimmt überein.
  2. Wählen Sie ein Zertifikat aus, das der Client erwartet, und senden Sie es.

Option 1 ist einfacher und gängiger. Schauen Sie sich das Zertifikat für google.com an! Sowohl auf dem Pi als auch auf dem Hauptserver wird dasselbe Zertifikat (für beide Domänen) installiert. Um ein solches Zertifikat von Let's Encrypt zu erhalten, benötigen Sie den Hauptserver, um auch eine Website für die dynamische Domäne von pi auszuführen, und verwenden Sie einen certbot-Befehl, um die Kontrolle über beide Domänen gleichzeitig zu überprüfen. Die Site des Hauptservers für den dyndns-Namen muss den Inhalt des pi nicht hosten - sie ist nur dort, sodass Let's Encrypt überprüfen kann, ob Sie die Kontrolle über diese Site haben (Sie können diese Site sogar zwischen Erneuerungen deaktivieren).

Beispiel für einen Certbot-Befehl (auf dem Hauptserver ausführen):

letsencrypt certonly --webroot --csr request.csr -w /http/pisite/www -d mypi.spdyn.de -w /http/mainwebsite/www -d maindomain.de

Wenn request.csreine Domäne als CN verwendet wird und beide Domänen im Feld SANs vorhanden sind, /http/pisite/wwwbezieht sich dies auf ein lokales Verzeichnis, das Sie für eine andere Website auf dem aktuellen Server erstellen, das an den dynamischen Namen des pi gebunden ist, und /http/mainwebsite/wwwist das vorhandene Verzeichnis Ihrer Hauptwebsite.


Option 2 ist umständlicher, liefert jedoch ein "saubereres" Ergebnis: Der Client erhält ein Zertifikat, das der von ihm eingegebenen Domäne entspricht. Führen Sie auf dem Himbeer-pi nginx mit dem Stream-Modul (oder einem gleichwertigen) aus, das beim Öffnen einer TLS-Verbindung das SNI-Feld untersucht (ohne die TLS-Verbindung zu akzeptieren), und wählt anhand der darin enthaltenen Domäne aus, welche Upstream-Komponente die Weiterleitung vornimmt Verbindung zu. Auf diese Weise können Sie auswählen, wie Sie Anforderungen der Hauptdomäne an dem externen Port behandeln möchten, die an das Himbeer-Pi weitergeleitet wird. Sie können sie an den Hauptserver senden, als ob sie auf dem richtigen Port erstellt wurden. Sie können sie an einen anderen Port auf dem Pi senden (z. B. Nextcloud oder irgendetwas anderes). Sie können sie mit derselben Nginx-Instanz und beenden Zeigen Sie die gewünschte Seite an oder schließen Sie einfach die Verbindung. Es ist deine Entscheidung.

Hier ist eine Beispielkonfiguration für diese Methode:

stream/sni-switch.conf

# Listen on 443, and on new connection: # if the SNI is mapped herein, handle it on this Nginx # else, forward the whole session to 192.168.1.80:443 (TCP passthrough, no decryption)  upstream mainwebserver { server 192.168.1.80:443; }  upstream local_https { server 127.0.0.1:1443; }  map $ssl_preread_server_name $name { default mainwebserver;  pisite.spdyn.de local_https; }  server { listen 443;  ssl_preread on; proxy_pass $name; } 

Und in nginx.conf

load_module /usr/lib/nginx/modules/ngx_stream_module.so;  stream { include /etc/nginx/stream/sni-switch.conf; }  ... 

Um dies mit Apache zu tun, sehen Sie dies . Eine Beispielkonfiguration, die folgendermaßen aussehen könnte:

<VirtualHost *:*> ProxyPreserveHost On ProxyPass "/" "http://192.168.1.80/" ProxyPassReverse "/" "http://192.168.1.80/" ServerName maindomain.de </VirtualHost> 
Ich danke Ihnen sehr für Ihre Antwort! Reagarding-Option 1 - Im Moment wird der Datenverkehr zum dynamischen DNS-Namen nicht über den Webserver geleitet. Das heißt, ich würde meinen dynamischen DNS-Hostnamen auf meinen Webserver umleiten, um das Zertifikat zu generieren. In Bezug auf Option 2: Ich verwende Apache. Ich denke, dieses Modul würde denselben Zweck erfüllen. https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI iYassin vor 6 Jahren 0
1- Das würde funktionieren, ja. Sie müssten jedoch bereit sein, diese signifikante Konfigurationsänderung etwa alle drei Monate vorzunehmen. 2 - [so geht's] (https://httpd.apache.org/docs/current/vhosts/examples.html#proxy) Scruffy vor 6 Jahren 0
Ich habe es jetzt mit der VirtualHost-Option realisiert und es funktioniert perfekt. Vielen Dank! iYassin vor 6 Jahren 0