Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Websocket server z SSL
k00sl
post
Post #1





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 20.04.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Lion
post
Post #2





Grupa: Zarejestrowani
Postów: 148
Pomógł: 14
Dołączył: 23.02.2013

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.12.2025 - 15:32