WebSocket z SSL

117

Czy można mieć WebSockets z HTTPS?

Podczas przełączania na HTTPS mój WebSocket zwraca błąd bezpieczeństwa i działa doskonale ze zwykłym HTTP.

Poniżej fragment;

socket = new WebSocket("ws://my_www:1235"); 
Eric
źródło
mój błąd, zdałem sobie sprawę, że serwer gniazda AIR, którego używam, nie jest bezpieczny, muszę przepisać, aby używać flash.net.SecureSocket ...
Eric

Odpowiedzi:

172

Połączenie WebSocket rozpoczyna swoje życie od uzgadniania HTTP lub HTTPS. Gdy dostęp do strony uzyskuje się za pośrednictwem protokołu HTTP, można użyć protokołu WS lub WSS (bezpieczny protokół WebSocket: WS przez TLS). Jednak gdy Twoja strona jest ładowana przez HTTPS, możesz używać tylko WSS - przeglądarki nie pozwalają na „obniżenie” poziomu bezpieczeństwa.

Peter Moskovits
źródło
to właśnie mam, ale zdałem sobie sprawę, że serwer gniazda AIR, którego używam, nie jest bezpieczny, muszę przepisać go na flash.net.SecureSocket ...
Eric
Flash ma też poważne problemy ... Czy budujesz serwer WebSocket (jeśli tak, to dlaczego), czy też tworzysz aplikację?
Peter Moskovits
1
Mam serwer z gniazdem AIR, który działa tak.
Eric
Jak więc wybrać WSS, jeśli strona nie jest ładowana przez HTTP?
anatoly techtonik
30

Nie możesz używać WebSockets przez HTTPS, ale możesz używać WebSockets przez TLS (HTTPS to HTTP przez TLS). Po prostu użyj „wss: //” w identyfikatorze URI.

Uważam, że najnowsza wersja Firefoksa nie pozwoli ci na używanie WebSockets innych niż TLS ze strony HTTPS, ale odwrotna sytuacja nie powinna stanowić problemu.

kanaka
źródło
Więc jakie jest rozwiązanie? Mam serwer WS działający przez http. Kupiłem SSL, a przeglądarka nie pozwala mi już łączyć się z WS. Zamieniłem WS na WSS: // i teraz nie łączy się z WebSocket
muaaz
@muaaz Twój serwer WebSocket powinien działać w trybie WSS i najlepiej załadowany z tymi samymi certyfikatami / kluczami SSL, co serwer sieciowy obsługujący Twoje strony internetowe, które próbują połączyć się z serwerem WebSocket.
kanaka
4
Dziękuję Ci. btw, właśnie rozwiązałem to przez proxy (przy użyciu apache) żądanie od wss://do ws://. Tak więc używam wss://ws.domain.comi apache stosuję na nim proxy i przekierowuję żądanie tam, gdzie działa serwer WS. np ws://10.12.23.45:5641/server.php. : . i wiem, że to bardzo złe rozwiązanie - chociaż na mnie działa. Byłbym wdzięczny za pomoc, jeśli poprowadzisz mnie przez konfigurację Apache. np .: gdzie umieścić .certitp. dzięki!
muaaz
@muaaz przepraszam, nie znam konfiguracji Apache poza samodzielnym wyszukiwaniem w Google.
kanaka
21

1 dodatkowe zastrzeżenie (poza odpowiedzią kanaka / peter): jeśli używasz WSS, a certyfikat serwera nie jest akceptowany przez przeglądarkę, możesz nie otrzymać żadnego okna dialogowego renderowanego przez przeglądarkę (tak jak to się dzieje na stronach WWW). Dzieje się tak, ponieważ WebSockets jest traktowany jako tak zwany „zasób podrzędny”, a okna dialogowe akceptacji certyfikatu / wyjątku bezpieczeństwa / jakiekolwiek okna dialogowe nie są renderowane dla zasobów podrzędnych.

oberstet
źródło
Nawet jeśli jest to ten sam certyfikat, co ten używany w przypadku protokołu HTTPS?
vekah
1
Co rozumiesz przez „okno dialogowe renderowane w przeglądarce”? Lubisz alert()?
Ivan Perevezentsev
2
Okna dialogowe, które natywnie pochodzą z przeglądarki (a nie strony). Na przykład „ten certyfikat jest nieprawidłowy, czy chcesz kontynuować?”
oberstet
więc czy istnieje sposób na przezwyciężenie tego? Jeśli używam certyfikatu z podpisem własnym, czy nadal mogę używać Websocket?
OhadR