-1
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:53000
Origin: null
Sec-WebSocket-Protocol: hmiModel
Sec-WebSocket-Key: Hbw2xjBq6OTGXzxeuqrdVQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

これは、Chrome ブラウザでクライアント側から取得したリクエスト キーです。その後、キーを Magic String と連結しました。

マジックストリングは 258EAFA5-E914-47DA-95CA-C5AB0DC85B11

次に、SHA1アルゴリズムを使用し、以下のハッシュ値を取得しました

a5877edcaa04801d07c5687aad3a6cf03d26ad5c

次に、base64を使用して上記の値をエンコードし、暗号化された値を次のように取得しました

Nzg1YWNkZTc0MGFhZDEwoDVjNzA=

次に、応答ハンドシェイクをクライアントに送信します

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Charset: ISO8859-1,UTF-8
Connection: keep-alive, Upgrade
WebSocket-Origin: localhost
WebSocket-Location: localhost
WebSocket-Protocol: hmiModel
Sec-webSocket-Version: 13
Sec-WebSocket-Accept: Nzg1YWNkZTc0MGFhZDEwODVjNzA=

しかし、コンソールでは、「WebSocket ハンドシェイク中のエラー: Sec-WebSocket-Accept の不一致」というエラーが表示されました。

このエラーが原因で onopen および onmessage イベントが発生しないようにします。

誰が私がどこで間違いを犯したか教えてもらえますか?

4

1 に答える 1

0

I haven't checked the output of your calculation but your intermediate hash value looks suspiciously long. Using the SHA1 code from RFC4634, I use code like the following to calculate the handshake response

std::string key;
// populate key with content of Sec-WebSocket-Key header
key.append("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
SHA1Context* sha1ctx = (SHA1Context*)malloc(sizeof(*sha1ctx));
(void)SHA1Reset(sha1ctx);
(void)SHA1Input(sha1ctx, key.c_str(), key.size());
uint8_t digest[SHA1HashSize];
(void)SHA1Result(sha1ctx, digest);
free(sha1ctx);
// convert std::string(&digest[0], sizeof(digest)) to base64

If you'd like more specific feedback, please edit your question to include your equivalent code.

于 2013-02-22T11:56:24.367 に答える