Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Websocket server z SSL
Forum PHP.pl > Forum > PHP
k00sl
Witam,

Posiadam problem z nawiązaniem bezpiecznego połączenia SSL za pomocą websocketów. Dokładniej mówiąc przeglądarka nie chce połączyć się za pomocą protokołu wss:// z serwerem wykonanym w PHP. Natomiast klient w PHP łączy się z nim bezproblemowo ( Dla jasności posiadam zainstalowany OpenSSL wraz z modułem. ). Pojęcia nie mam, dlaczego tylko przeglądarka ma z tym problem. Korzystałem z gotowców dostępnych w sieci, lecz z każdym to samo. Osoby z takim samym kłopotem rozwiązały go za pomocą nginx'a lub stunnela, jednak nie zapobiega to nasłuchiwaniu lokalnych połączeń w miejscu gdzie stoi serwer, a bardzo zależy mi na tym, aby było to w pełni bezpieczne połączenie. Oczywiście nie korzystając z SSL wszystko działa jak należy.

Dostępne wykorzystane gotowce:

https://github.com/spatzle/phpws
https://github.com/Devristo/phpws


Będę wdzięczny za udzielenie mi porady, być może ktoś z Was miał z tym styczność.

Pozdrawiam.
Zaszczyk
Rozwiązałeś swój problem? Bo właśnie walczę z identycznym problemem wink.gif
Crozin
Podstawowa informacja, której zabrakło: jakimi błędami rzuca przeglądarka?
Zaszczyk
Uczę się websocketów na tym serwerze: https://github.com/Flynsarmy/PHPWebSocket-C...HPWebSocket.php. Mój client JS wygląda tak:
  1. var host = 'wss://xxx.xx:44444/';
  2. try{
  3. socket = new WebSocket(host);
  4. $('#msg').append('WebSocket created - status '+socket.readyState+'<br />');
  5.  
  6. socket.onopen = function(msg){
  7. $('#msg').append("Connected - status "+this.readyState+'<br />');
  8. socket.send('jaguar');
  9. };
  10.  
  11. socket.onmessage = function(msg){
  12. console.log("Received: "+msg.data);
  13. console.log(msg);
  14. $('#msg').append(msg.data+'<br />');
  15. };
  16.  
  17. socket.onerror = function(msg) {
  18. $('#msg').append('Error '+msg.code+' '+msg.reason+'<br />');
  19. console.log(msg);
  20. };
  21.  
  22. socket.onclose = function(msg){
  23. $('#msg').append("Disconnected - status "+this.readyState+'<br />');
  24. socket.close();
  25. };
  26. }
  27. catch(ex){ console.log(ex); }


Po włączeniu serwer i odświeżeniu klienta pojawia się komunikat:
WebSocket created - status 0
Następnie po około 10 sekundach następne:
Error undefined undefined
Disconnected - status 3

I wtedy serwer informuje o tym, że klient się rozłączył. Wszystko działało perfekcyjnie dopóki połączenie było protokole ws, gdy zmieniłem na wss dzieję się tak jak opisałem. Hostingodawca mówi, że konfiguracji jest w porządku. W konfiguracji serwera websocket (PHPWebSocket-Chat), mam podane IP serwera i port 44444. Wg mnie, przy używaniu SSL, trzeba zmienić nagłówki handshake, ale nie wiem na jakie...
Lion
Walczyłem z tym problemem przez ostatnie 3 dni. W końcu nam się udało to doprowadzić do stanu używalności. Nasza implementacja serwera jest naszym własnym pomysłem, mamy napisanego moda do Apache dzięki któremu możemy otwierać połączenie na porcie 80 i robić inne potrzebne nam rzeczy, ale kilka wniosków może przyda się także innym:

Okazało się, że w przypadku odsyłania handshake dla WSS Apache doklejał do tego nagłówek 200 oraz uznawał że połączenie jest "chunked". Żeby to ominąć musieliśmy wyłączyć dla tego połączenia filtry http_in, content_length, http_header, chunk. Po zrobieniu tego mogliśmy się już połączyć z serwerem, klient odbierał dane z serwera, ale serwer miał problemy z zdekodowaniem danych od klienta. Po debugowaniu co takiego dosyła nam klient okazało się, że czytamy ze streama tylko jeden bajt nagłówków zamiast oczekiwanych dwóch (na pierwszym bajcie zapisane jest czy websocket przesyła dane w jednym pakiecie, czy też są one zdefragmentowane oraz jaki jest typ danych, na drugim powinna być ilość bajtów danych w pakiecie). Problemu nie było w przypadku połączenia przez WS nagłówki zawsze dochodziły w całości, prawdopodobnie fragmentacja powstaje w niższej warstwie TCP/IP z powodu narzutu jaki generuje SSL. Wystarczyło otoczyć funkcję czytającą ze streama odpowiednią pętlą while i czekać aż do streama dojdą wszystkie nagłówki z websocketa.

Tak więc jeśli chodzi o sam format handshake to jest on bez zmian. Jeśli połączenie jest nawiązane, a nic nie dociera to zacząłbym od wypisania sobie co takiego odbiera funkcja czytająca ze streama, jeżeli jest to tylko \x81 to oznacza to że nagłówki z websocketa napływają, ale są zdefragmentowane. Jeśli dosyłacie dane tekstowe, a dochodzi coś co nie zaczyna się od \x81 lub \x01 to znaczy że to raczej nie jest połączenie z websocket. Przykłady jak powinien wyglądać pakiet można znaleźć w RFC: http://tools.ietf.org/html/rfc6455#section-5.7
Zaszczyk
Zapisuję sobie handshake wysyłany przez klienta do pliku i dostaję totalne krzaczki - nie da się ich nawet wkleić do postu. Jedyną rzeczą odczytywalną dla człowieka, jest nazwa domeny która występuje dwukrotnie. No i teraz pytanie: jak odszyfrować te krzaczki? Dodam że mają długość 181 znaków.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.