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. |
|
|
|
![]() |
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 |
|
|
|
k00sl Websocket server z SSL 29.03.2014, 13:04:37
Zaszczyk Rozwiązałeś swój problem? Bo właśnie walczę z iden... 14.05.2014, 22:27:54
Crozin Podstawowa informacja, której zabrakło: jakimi błę... 15.05.2014, 07:19:44
Zaszczyk Uczę się websocketów na tym serwerze: https://gith... 15.05.2014, 17:45:52
Zaszczyk Zapisuję sobie handshake wysyłany przez klienta do... 25.05.2014, 22:59:28 ![]() ![]() |
|
Aktualny czas: 27.12.2025 - 15:15 |