在WebSocket握手期间出现错误:Sec-WebSocket-Accept不匹配
问题描述:
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连接起来。在WebSocket握手期间出现错误:Sec-WebSocket-Accept不匹配
魔术字符串是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的握手过程中得到了错误的“错误:二段的WebSocket,接受不匹配 “
因此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
如果您想更具体的反馈,请编辑您的问题,包括你的等效代码。
好的。我将添加SHA1值实现代码 – 2013-02-22 12:17:48