Warum unterstützen aktuelle WebSocket-Client-Implementierungen keine Proxys?

StackOverflow https://stackoverflow.com/questions/2201317

  •  18-09-2019
  •  | 
  •  

Frage

Ein Web Socket erkennt das Vorhandensein eines Proxyservers und richtet automatisch einen Tunnel für die Durchleitung durch den Proxy ein.Der Tunnel wird durch die Ausgabe einer HTTP-CONNECT-Anweisung an den Proxyserver eingerichtet, die den Proxyserver auffordert, eine TCP/IP-Verbindung zu einem bestimmten Host und Port herzustellen.Sobald der Tunnel eingerichtet ist, kann die Kommunikation ungehindert über den Proxy fließen.Da HTTP/S auf ähnliche Weise funktioniert, können sichere Web Sockets über SSL dieselbe HTTP CONNECT-Technik nutzen.[1]

OK, hört sich nützlich an!Aber in den Client-Implementierungen, die ich bisher gesehen habe (Go [2], Java [3]), sehe ich nichts im Zusammenhang mit der Proxy-Erkennung.

Übersehe ich etwas oder sind diese Implementierungen noch jung?Ich weiß, dass WebSockets extrem neu ist und Client-Implementierungen möglicherweise ebenso jung und unausgereift sind.Ich möchte nur wissen, ob mir etwas zur Proxy-Erkennung und -Verwaltung fehlt.

[1] http://www.kaazing.org/confluence/display/KAAZING/What+is+an+HTML+5+WebSocket

[2] http://golang.org/src/pkg/websocket/client.go

[3] http://github.com/adamac/Java-WebSocket-client/raw/master/src/com/sixfire/websocket/WebSocket.java

War es hilfreich?

Lösung 3

Die Antwort ist, dass diese Kunden einfach keine Proxys unterstützen. -Occam

Andere Tipps

Lassen Sie mich versuchen, die unterschiedlichen Erfolgsraten zu erklären, die Sie möglicherweise begegnet sind. Während das HTML5-Web-Socket-Protokoll selbst Proxy-Server und Firewalls nicht bewusst ist, verfügt es über einen HTTP-kompatiblen Handshake, damit HTTP-Server ihre Standard-HTTP- und HTTPS-Ports (80 und 443) mit einem Web-Sockets-Gateway- oder Server teilen können.

Das Web -Socket -Protokoll definiert ein Präfix WS: // und WSS: //, um eine WebSocket bzw. eine WebSocket -Verbindung anzugeben. Beide Schemata verwenden einen HTTP -Upgrade -Mechanismus, um das Web -Socket -Protokoll zu aktualisieren. Einige Proxy -Server sind harmlos und funktionieren gut mit Web -Sockets. Andere verhindern, dass Web -Sockets korrekt funktionieren, was dazu führt, dass die Verbindung fehlschlägt. In einigen Fällen kann eine zusätzliche Proxy -Server -Konfiguration erforderlich sein, und bestimmte Proxy -Server müssen möglicherweise aktualisiert werden, um Web -Sockets zu unterstützen.

Wenn der unverschlüsselte WebSocket -Datenverkehr über einen expliziten oder einen transparenten Proxy -Server auf seiner Art des Websocket -Servers fließt, ist die Verbindung, ob sich der Proxy -Server so verhält, wie er sollte oder nicht, mit ziemlicher Sicherheit an Fehlgeschlagen (in Zukunft, Proxy -Server Web -Socket bewusst werden). Daher sollten unverschlüsselte Websocket -Verbindungen nur in den einfachsten Topologien verwendet werden.

Wenn eine verschlüsselte WebSocket -Verbindung verwendet wird, stellt die Verwendung von Transport Layer Security (TLS) in den Web -Sockets sicher, dass ein Befehl http Connect ausgestellt wird, wenn der Browser für die Verwendung eines expliziten Proxy -Servers konfiguriert ist. Hierbei werden ein Tunnel eingerichtet, der über den HTTP-Proxy zwischen den Web-Sockets Secure Client und dem WebSocket-Server ein niedrigem Niveau-End-to-End-TCP-Kommunikation bietet. Bei transparenten Proxy -Servern ist der Browser den Proxy -Server nicht bewusst, sodass kein HTTP -Connect gesendet wird. Da der Drahtverkehr jedoch verschlüsselt ist, können intermediäre transparente Proxy -Server einfach den verschlüsselten Datenverkehr durchlaufen. Daher besteht eine viel bessere Wahrscheinlichkeit, dass die Websocket -Verbindung erfolgreich ist, wenn Web -Sockets sicher verwendet werden. Die Verwendung von Verschlüsselung ist natürlich nicht kostenlos, bietet aber häufig die höchste Erfolgsrate.

Eine Möglichkeit, es in Aktion zu sehen, besteht darin, das Kaazing WebSocket-Gateway herunterzuladen und zu installieren-ein hoch optimiertes, proxybewusstes WebSocket-Gateway, das native WebSocket-Unterstützung sowie eine vollständige Nachahmung des Standards für ältere Browser bietet.

Der Kommunikationskanal ist bereits festgelegt, wenn das WebSocket -Protokoll in die Szene eintritt. Das WebSocket ist auf TCP und HTTP aufgebaut, sodass Sie sich nicht um die Dinge kümmern müssen, die diese Protokolle, einschließlich Proxies, bereits getan haben.

Wenn eine WebSocket -Verbindung hergestellt wird, beginnt sie immer mit einer HTTP/TCP -Verbindung, die später während der "Handshake" -Phase von WebSocket "aktualisiert" wird. Zu diesem Zeitpunkt wird der Tunnel festgelegt, sodass die Stellvertreter transparent sind und sich nicht um sie kümmern müssen.

In Bezug auf WebSocket -Clients und transparente Proxys denke ich, dass WebSocket -Client -Verbindungen aus folgenden Gründen die meiste Zeit nicht bestanden werden (nicht getestet):

  • Wenn die Verbindung in Ordnung ist und der Client nicht weiß, dass er mit einem HTTP-Proxyserver kommuniziert, sendet er nicht die Anweisung „CONNECT TO“, die den HTTP-Proxy in einen TCP-Proxy umwandelt (erforderlich für den Client nach dem Websocket). Handschlag).Es könnte funktionieren, wenn der Proxy nativ WebSocket unterstützt und die URL mit dem ws-Schema anders als http behandelt.

  • Wenn die Verbindung über SSL erfolgt, kann der transparente Proxy nicht wissen, zu welchem ​​Server er sich verbinden soll, da er den Hostnamen in der https-Anfrage entschlüsselt hat.Es könnte entweder ein selbstsigniertes Zertifikat im laufenden Betrieb generiert werden (wie bei SSLStrip) oder ein eigenes statisches Zertifikat bereitgestellt und die Kommunikation entschlüsselt werden, aber wenn der Client das Serverzertifikat validiert, schlägt dies fehl (siehe https://serverfault.com/questions/369829/setting-up-a-transparent-ssl-proxy).

Sie haben Java-Proxies erwähnt, und um darauf zu antworten, wollte ich erwähnen, dass Java-Websocket jetzt Proxies unterstützt.

Hier können Sie die Informationen dazu sehen: http://github.com/tootallnate/java-websocket/issues/88

websocket-client, ein Python -Paket, unterstützt Proxies zumindest über ein sicheres Schema wss:// Wie in diesem Fall müssen Proxy den Verkehr vorwärts bewusst sein.

https://github.com/liris/websocket-client/commit/9f4cdb9ec982bfedb9270e883Adab2E028BBD8E9

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top