WebSocket握手期间出错:秒WebSocket Accept不匹配

Error during WebSocket handshake: Sec-WebSocket-Accept mismatch

本文关键字:WebSocket Accept 不匹配 出错      更新时间:2023-10-16
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浏览器上从客户端得到的请求密钥。之后,我把钥匙和魔术串连在一起。

魔术串是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事件就不会因为这个错误而触发。

有人能告诉我我在哪里犯的错吗?

我还没有检查您的计算结果,但您的中间哈希值看起来很长。使用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

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