在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 

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

+0

好的。我将添加SHA1值实现代码 – 2013-02-22 12:17:48