рукопожатие websocket терпит неудачу с сервером c # - PullRequest
0 голосов
/ 08 июня 2018

Я попытался настроить веб-сокет на стороне сервера в C #, как описано в https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers, но как только я пытаюсь подключиться, происходит сбой с Error during WebSocket handshake: Incorrect 'Sec-WebSocket-Accept'

        public string ComputeWebSocketHandshakeSecurityHash(String secWebSocketKey) {
        const String MagicKEY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
        String secWebSocketAccept = String.Empty;

        // 1. Combine the request Sec-WebSocket-Key with magic key.
        String ret = secWebSocketKey + MagicKEY;

        // 2. Compute the SHA1 hash
        SHA1 sha = new SHA1CryptoServiceProvider();
        byte[] sha1Hash = sha.ComputeHash(Encoding.UTF8.GetBytes(ret));

        // 3. Base64 encode the hash
        secWebSocketAccept = Convert.ToBase64String(sha1Hash);
        return secWebSocketAccept 
        };

ПримерСтраница указывает, что dGhlIHNhbXBsZSBub25jZQ== должно привести к s3pPLMBiTxaQ9kYGzzhZRbK+xOo=, и это работает.

Вот примеры заголовков из клиента Chrome:

Заголовки запроса:

        Accept-Encoding: gzip, deflate, br
        Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
        Cache-Control: no-cache
        Connection: Upgrade
        Host: localhost:4444
        Origin: https://localhost
        Pragma: no-cache
        Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
        Sec-WebSocket-Key: GW/l6VLlmjmmwZ2U6BMg7g==
        Sec-WebSocket-Protocol: plain
        Sec-WebSocket-Version: 13
        Upgrade: websocket
        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)             AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36

Заголовки ответа:

        Connection: Upgrade
        Sec-WebSocket-Accept: RNBWSHjxgtG6/yEZKh/9U776A5U=
        Upgrade: WebSocket

Очевидно, что примитеключ не соответствует ключу запроса, но почему?И почему это работает на примере Mozilla ws таким образом?

1 Ответ

0 голосов
/ 20 июня 2018

Я наконец решил проблему.Но, как он указывает, это не имеет ничего общего с кодом выше;это работает как задумано.Причиной, по которой это всегда не удавалось соединиться, был неправильный ключ, который был передан функции, что привело к неверному результату.(Я сохраню пост, чтобы другие могли использовать код для создания хэшей).

В своем тесте я попытался передать данные в функцию, используя

sData = sReader.ReadLine();
        if (sData.StartsWith("Sec-WebSocket-Key: "))
        {
            string key = sData.Substring(19, sData.Length - 19).Trim(' ');
            String hashKey = ComputeSocketAcceptString(key);
            //Response here
        }

Однако подстрока, которая была извлеченакод из запроса был неверным.Это заставило функцию вычислять неправильный хеш.

Для всех, кто ищет некоторые правильные значения запроса / ответа для проверки, вот некоторые из них:

Sec-WebSocket-Key: fAB2VSri/zcQdblwjKH9Ow== Sec-WebSocket-Accept: sGQcFOVDy7ctcd9TTk4Jr9vtXaQ=

Sec-WebSocket-Key: +YFXjHbEdHlvigafwh/Ixw== Sec-WebSocket-Accept: xdj5tRanzBYNvV31W6QIY5+mNjI=

Sec-WebSocket-Key: bNS0upBX5U6lICKLvFokUg== Sec-WebSocket-Accept: G66BkTwtxFeWMHaV7Dm/Cd4g+Rg=

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...