-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 mismatch

因此 onopen 和 onmessage 事件不会因为这个错误而触发。

谁能告诉我我在哪里做错了?

4

1 回答 1

0

我没有检查你的计算输出,但你的中间哈希值看起来很长。使用来自RFC4634的 SHA1 代码,我使用如下代码来计算握手响应

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

如果您想要更具体的反馈,请编辑您的问题以包含您的等效代码。

于 2013-02-22T11:56:24.367 回答