Forum: PC Hard- und Software Kennt sich jemand mit NGINX aus? Thema: HTTPS und HTTP ohne SSL terminierung weiterleiten


von C. H. (hedie)


Lesenswert?

Hallo zusammen

Ich habe folgendes Thema:

An meinem nginx hängen als Beispiel 2 Backend. BackendA und BackendB
public IP -> nginx -> Backend A, Backend B etc...

Nun möchte ich, dass der gesamte Traffic für *.app.domain.tld an 
BackendA geht und zwar HTTPS wie auch HTTP ohne, dass nginx die SSL 
terminierung macht. Dies deshalb, weil BackendA selbst ein SSL 
Zertifikat von LetsEncrypt ausliefern soll und dieses auch selbst 
bezieht.

BackendB hingegen macht keine SSL terminierung, hier soll nginx dies 
übernehmen.

Für BackendB ist mir klar wie es geht. Jedoch weiss ich nicht, wie ich 
dies für BackendA implementieren kann.

Kennt sich hier jemand damit aus?
Idealerweise weiss jemand, wie dies mit dem nginx proxy manager gemacht 
werden kann.

Meine Versuche bisher:

https://i.stack.imgur.com/p3Rq8.png

Haben leider nicht funktioniert.
Firefox meldet dann:

https://i.stack.imgur.com/5D8D0.png

Auch kann ich keinen Stream erstellen:
https://i.stack.imgur.com/r4M88.png

Da dort nur der gesamte Traffic geroutete werden kann.

Danke schonmal :)

von Foobar (asdfasd)


Lesenswert?

Wie unterscheidest du denn, ob eine eingehende Verbindung nach A oder B 
geht?  Um an den Request ranzukommen (URL, Header, etc) muß SSL ja 
erstmal terminiert werden.

von Daniel A. (daniel-a)


Lesenswert?

Ob / wie nginx das kann, kann ich nicht sagen. Aber das Stichwort um SSL 
so zo Routen ist "TLS SNI reverse Proxy" (oft kurz "SNI Proxy" genannt).
(Da gibt es diverse Projekte. (Ich hatte zum spass auch mal einen 
geschrieben https://github.com/Daniel-Abrecht/DPA-SSL-SNI-Forwarder aber 
keine Ahnung, ob der noch geht, und Wildcards hatte ich dort noch nicht 
implementiert).

Was man dabei noch beachten muss, ist, Der SNI muss nicht zwangsweise 
vorhanden sein. Bei ganz alten Browsern hängt er. Und bei ganz neuen TLS 
Versionen gibt es glaube ich einen alternativen Weg (ESNI / ECH), für 
Server das richtige Zertifikat auszuhandeln, weil das ja eine streng 
geheime Information ist. Da geht das dann auch nicht mehr. Ist also 
nicht unbedingt eine gute Idee, sich darauf zu verlassen.

Auch noch zu beachten ist, dass der SNI und der Host Header nicht immer 
der selbe ist. Man kann also im SNI "bla.app.domain.tld" haben, aber im 
Host Header "localhost". Wenn man um ne teure Firewall herumkommen will, 
ist der Trick manchmal Gold wert.

TLDR: Mach die Terminierung bei nginx, das mag zwar weniger Sicher sein, 
aber funktioniert dafür immer & zuverlässig. Wenn du willst kannst du 
noch https zum Backend machen, mit gepinntem Zertifikat. Ist beim nginx 
dann zwar trotzdem Klartext, aber hey, wenn man den Kontrolliert, kann 
man sich auch ein LE Cert ausstellen lassen.

Alternativ, falls du reines IPv6 hast, könntest du auch einfach 2 
unterschiedliche IPs nehmen, bei v6 bekommt man ja normalerweise mehr 
als genug davon.

von C. H. (hedie)


Lesenswert?

Vielen Dank für die Antworten

Ich sehe, mein Vorhaben scheint nicht wirklich perfekt zu sein.
Hintergrund dafür ist, dass ich caprover laufen lassen möchte (oder eine 
ander PaaS opensource lösung).

CapRover https://caprover.com/ erstellt selbst neue domains und ssl 
zertifikate für neue applikationen. Daher wollte ich dies 1:1 forwarden.

Ich wüsste nicht, wie dies sonst zu handhaben wäre.
Die Idee mit der IP ist an sich nicht schlecht. Kostet aber wieder 
zusätzliches Geld...

Habt ihr evtl. sonst noch eine Idee?

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Foobar schrieb:
> Wie unterscheidest du denn, ob eine eingehende Verbindung nach A oder B
> geht?  Um an den Request ranzukommen (URL, Header, etc) muß SSL ja
> erstmal terminiert werden.

SNI = Server Name Identification. Der Servername ist exakt deshalb die 
einzige Info, die unverschlüsselt auf die Reise geht. Anders könnte man 
nicht mehrere virtuelle Webserver unter einer IP-Adresse unterbringen.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Daniel A. schrieb:
> Bei ganz alten Browsern hängt er.

Wer heute noch mit einem Browser im Internet unterwegs ist, der kein SNI 
beherrscht, den kann man ignorieren.

: Bearbeitet durch User
von C. H. (hedie)


Lesenswert?

(prx) A. K. schrieb:
> SNI = Server Name Identification. Der Servername ist exakt deshalb die
> einzige Info, die unverschlüsselt auf die Reise geht. Anders könnte man
> nicht mehrere virtuelle Webserver unter einer IP-Adresse unterbringen.

Wie ich dich verstehe, sollte somit die Lösung mit einem SNI Proxy 
durchaus zuverlässig funktionieren?

von (prx) A. K. (prx)


Lesenswert?

C. H. schrieb:
> Wie ich dich verstehe, sollte somit die Lösung mit einem SNI Proxy
> durchaus zuverlässig funktionieren?

Im Prinzip sollte das möglich sein, ich habe allerdings keinen parat.

von C. H. (hedie)


Lesenswert?

(prx) A. K. schrieb:
> C. H. schrieb:
>> Wie ich dich verstehe, sollte somit die Lösung mit einem SNI Proxy
>> durchaus zuverlässig funktionieren?
>
> Im Prinzip sollte das möglich sein, ich habe allerdings keinen parat.

https://github.com/dlundquist/sniproxy

Hier gibt es offenbar einen relativ aktuellen (basierend auf den letzten 
commit daten)

von (prx) A. K. (prx)


Lesenswert?

Halte dich da eher an Daniel. Er hatte offenbar konkret daran gesessen. 
Ich habe mehr mit Webservern mit SNI zu tun, und mit Firewalls, die TLS 
nicht nur forwarden, sondern obendrein den Inhalt inspizieren.

: Bearbeitet durch User
von Foobar (asdfasd)


Lesenswert?

Daniel schrieb:
> Auch noch zu beachten ist, dass der SNI und der Host Header nicht immer
> der selbe ist.

Bei Proxies hast du drei: CONNECT, Host, SNI :-/

prx schrieb:
>Foobar schrieb:
>> Wie unterscheidest du denn, ob eine eingehende Verbindung nach A oder B
>> geht?  Um an den Request ranzukommen (URL, Header, etc) muß SSL ja
>> erstmal terminiert werden.
>
> SNI = Server Name Identification.

Das war halt die Frage.

C.H. schrieb:
> Wie ich dich verstehe, sollte somit die Lösung mit einem SNI Proxy
> durchaus zuverlässig funktionieren?

Du musst dir halt über eingehende Verbindungen ohne SNI (mein wget z.B. 
kanns noch nicht, generell ältere Clients, inkl Handys/Browser) Gedanken 
machen.  Wenn die Clients z.B. alle bekannt sind und es unterstützen, 
kein Problem.  Dann bräuchtest du allerdings auch kein Lets-Encrypt 
Zertifikat ...

Ich bin kein Fan von SNI, ein typischer Schnellschuß der Hoster ...

von (prx) A. K. (prx)


Lesenswert?

Foobar schrieb:
> generell ältere Clients, inkl Handys/Browser)

Mit derart ollen Geräten, mit denen man an fehlendem SNI scheitert, 
droht man aber auch an der heute gängigen Forderung nach TLS ab 1.2 zu 
scheitern.

> mein wget z.B. kanns noch nicht

Hattest du es in letzter Zeit nicht so mit Updates?
Der wget kann es seit 2012. ;-)

: Bearbeitet durch User
von Foobar (asdfasd)


Lesenswert?

prx schrieb:
> Hattest du es in letzter Zeit nicht so mit Updates?

Korrekt.  Habe allerdings auch viele ältere Geräte im Einsatz, für die 
es keine Updates gibt.

> droht man aber auch an der heute gängigen Forderung nach TLS ab 1.2 zu
> scheitern.

Jo, ist eine Seuche geworden - selbst µC.net.  Um das Problem an der 
Wurzel zu fassen, läuft auf meinem Router ein Proxy, der den 
HTTPS-Traffic aufbricht und auf moderne Ciphers umsetzt (inkl SNI).

von Some O. (some_one)


Lesenswert?

C. H. schrieb:
> Ich sehe, mein Vorhaben scheint nicht wirklich perfekt zu sein.
> Hintergrund dafür ist, dass ich caprover laufen lassen möchte (oder eine
> ander PaaS opensource lösung).

Was ist denn Deine Idee, und warum denkst Du daß Du eine Paas-Software 
dafür brauchst?

> CapRover https://caprover.com/ erstellt selbst neue domains und ssl
> zertifikate für neue applikationen. Daher wollte ich dies 1:1 forwarden.

Ich kenne Caprover nicht, aber es "erstellt neue Domains"? Was heißt 
das, registriert es die Domain?

Das mit den TLS-Certs können heute viele Lösungen, vom Reverse Proxy 
Traefik, über den Webserver Caddy, bis hin zu externer Software etwa für 
HAProxy, nginx oder Apache.

> Habt ihr evtl. sonst noch eine Idee?

Klar: mit dem Reverse Proxy das TLS terminieren und dann den Upstream 
zum Server wieder verschlüsseln -- das kann mit einem selbstsignierten 
Zertifikat passieren, mußt Du dann halt beim nginx bekannt machen.

Aber der Möglichkeiten gibts viele, darum meine Frage, was Du am Ende 
wirklich erreichen möchtest.

von Some O. (some_one)


Lesenswert?

(prx) A. K. schrieb:
> Daniel A. schrieb:
>> Bei ganz alten Browsern hängt er.
>
> Wer heute noch mit einem Browser im Internet unterwegs ist, der kein SNI
> beherrscht, den kann man ignorieren.

Ignorieren, verhauen, auf eine einsame Insel ohne Telefon und Internet 
verbannen... YMMV. :)

von Some O. (some_one)


Lesenswert?

Foobar schrieb:
> Jo, ist eine Seuche geworden - selbst µC.net.  Um das Problem an der
> Wurzel zu fassen, läuft auf meinem Router ein Proxy, der den
> HTTPS-Traffic aufbricht und auf moderne Ciphers umsetzt (inkl SNI).

Moderne Chiphers wie ROT-13?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.