WebSocket mit SSL

115

Ist es möglich, WebSockets mit HTTPS zu haben?

Beim Wechsel zu HTTPS gibt mein WebSocket einen Sicherheitsfehler zurück und funktioniert einwandfrei mit normalem HTTP.

Unten ein Ausschnitt;

socket = new WebSocket("ws://my_www:1235"); 
Eric
quelle
Mein schlechtes, ich habe festgestellt, dass der AIR-Socket-Server, den ich verwende, nicht sicher ist. Ich muss neu schreiben, um flash.net.SecureSocket zu verwenden ...
Eric

Antworten:

170

Die WebSocket-Verbindung beginnt ihr Leben mit einem HTTP- oder HTTPS-Handshake. Wenn auf die Seite über HTTP zugegriffen wird, können Sie WS oder WSS verwenden (WebSocket Secure: WS über TLS). Wenn Ihre Seite jedoch über HTTPS geladen wird, können Sie nur WSS verwenden - Browser erlauben kein "Downgrade" der Sicherheit.

Peter Moskovits
quelle
Das ist, was ich habe, aber ich habe festgestellt, dass der AIR-Socket-Server, den ich verwende, nicht sicher ist. Ich muss neu schreiben, um flash.net.SecureSocket zu verwenden ...
Eric
Flash hat auch schwerwiegende Probleme ... Erstellen Sie einen WebSocket-Server (wenn ja, warum) oder erstellen Sie eine App?
Peter Moskovits
1
Ich habe einen AIR-Socket-Server, auf dem ja läuft.
Eric
Wie wähle ich WSS aus, wenn die Seite nicht mit HTTP geladen ist?
Anatoly Techtonik
29

Sie können WebSockets nicht über HTTPS verwenden, aber Sie können WebSockets über TLS verwenden (HTTPS ist HTTP über TLS). Verwenden Sie einfach "wss: //" in der URI.

Ich glaube, dass Sie in der neuesten Version von Firefox keine Nicht-TLS-WebSockets von einer HTTPS-Seite verwenden können, aber das Gegenteil sollte kein Problem sein.

Kanaka
quelle
Also, was ist die Lösung? Ich habe einen WS-Server, der über http läuft. Ich habe ein SSL gekauft und der Browser erlaubt mir nicht mehr, eine Verbindung mit WS herzustellen. Ich habe WS auf WSS: //
umgestellt
@muaaz Ihr WebSocket-Server sollte im WSS-Modus ausgeführt und vorzugsweise mit denselben SSL-Zertifikaten / Schlüsseln geladen werden wie Ihr Webserver, der Ihre ursprünglichen Webseiten bedient, die versuchen, eine Verbindung zum Websocket-Server herzustellen.
Kanaka
4
Danke dir. Übrigens habe ich es gerade gelöst, indem ich die Anfrage von wss://bis (mit Apache) proxiert habe ws://. Also verwende wss://ws.domain.comund apache ich den Proxy darauf und leite die Anfrage um, wo der WS-Server läuft. zB : ws://10.12.23.45:5641/server.php. und ich weiß, dass es eine sehr schlechte Lösung ist - obwohl es für mich funktioniert. Ich würde mich über Ihre Hilfe freuen, wenn Sie mich durch die Apache-Konfiguration führen. zB: wo soll man das .certetc. hinstellen danke!
Muaaz
@muaaz sorry, ich kenne die Apache-Konfiguration nicht, außer sie selbst zu googeln.
Kanaka
21

1 zusätzliche Einschränkung (neben der Antwort von Kanaka / Peter): Wenn Sie WSS verwenden und das Serverzertifikat für den Browser nicht akzeptabel ist, wird möglicherweise kein vom Browser gerenderter Dialog angezeigt (wie dies bei Webseiten der Fall ist ). Dies liegt daran, dass WebSockets als sogenannte "Subressource" behandelt wird und Zertifikate akzeptieren / Sicherheitsausnahme / welche Dialoge auch immer nicht für Subressourcen gerendert werden.

oberstet
quelle
Auch wenn es das gleiche Zertifikat ist wie das für HTTPS verwendete?
Vekah
1
Was meinst du mit "Browser gerenderter Dialog"? Wie alert()?
Ivan Perevezentsev
2
Dialoge, die ursprünglich aus dem Browser stammen (keine Seite). Wie "Dieses Zertifikat ist ungültig, möchten Sie fortfahren?"
Oberstet
Gibt es also einen Weg, dies zu überwinden? Kann ich den Websocket weiterhin verwenden, wenn ich ein selbstsigniertes Zertifikat verwende?
OhadR