WebSocket не может работать через защищенное соединение
Проблема в следующем: есть webSocket-сервер, который обрабатывает ws и wss на разных портах. WS работает замечательно. А вот через WSS сервер не может получить Handshake. Сделал вывод результата — WSS присылает только одну букву из всего запроса. Естественно дальше не получается свалидировать handshake и происходит отключение от сервера.
Пытался гуглить — ничего толкового не нашел. Были советы поиграться с ручной установкой версии протокола SSLv23. Запустил под хромом и все вроде бы шикарно, но под FireFox ничего не изменилось. Пытаюсь разобраться уже второй день. Если кто-то может подсказать решение проблемы — буду безгранично благодарен.
Эмм… я совсем запутался. Убрал версию протокола совсем, перезапустил и результат меня удивил. В хроме все также продолжает работать, а Firefox все также не продолжает работать.
Встречался с похожей проблемой.
В моём случае Fiddler2 помог понять, что на самом деле сервер просто падает 500 ошибкой из-за кривого хэндшейка (в моём случае ошибка была совсем очевидной).
Уверен, что случаи разные бывают, но уверен, продебажить проблему это вам поможет.
Удачи!
Несколько часов дебага рассказали вот что: сразу после коннекта браузер посылает заголовки, на которые я должен ответить хендшейком. В хроме все замечательно приходит, а вот в firefox (и опере тоже) эти заголовки приходят двумя частями. Сначала буква G, а потом ET / и т.п. Причем такие запросы приходят от Firefox\Opera не только до хендшейка, но и после. Исправил все оберткой над методом recv, которая проверяет, что если был получен один символ из сокета, то надо получить из сокета вторую часть запроса и склеить с этим символом. Все стало работать, но решение мне не очень нравится. Сначала грешил на gevent и gevent.ssl (сервер написан на Python + gevent), но так как в хроме такой баг повторяется очень редко, а в firefox и opera стабильно, то мне стало казаться, что во всем виноваты браузеры. Хотя я все еще не понимаю как такое происходит.
Напоминаю вам, что как TCP, так и SSL передают не последовательность пакетов, а единый поток данных. И если сервер не понимает, что когда ему пришла буква G, он должен ждать следующую, а не сбрасывать соединение — то этот сервер работает неправильно.
Сертификат не самоподписанный. Но и не самый надежный. Фаерфоксу он в целом нравится. Нашел проблему, причину так и не понял, но сделал костыль, который все поправил. Описание проблемы ниже. Буду рад, если кто-то сможет объяснить почему так происходит.