Websocket 服务器握手响应

Posted

技术标签:

【中文标题】Websocket 服务器握手响应【英文标题】:Websocket server handshake response 【发布时间】:2018-02-25 03:40:23 【问题描述】:

我正在尝试设置 websocket 通信。我可以打开 websocket,但我不知道如何让握手响应正确。根据几个网站:

“此外,服务器可以在这里决定扩展/子协议请求;有关详细信息,请参阅杂项。Sec-WebSocket-Accept 部分很有趣。服务器必须从客户端发送的 Sec-WebSocket-Key 派生它。得到它,将客户端的 Sec-WebSocket-Key 和“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”连接在一起(它是一个“魔术字符串”),获取结果的 SHA-1 哈希,并返回 base64 编码哈希...因此,如果密钥是“dGhlIHNhbXBsZSBub25jZQ==”,则接受将是“s3pPLMBiTxaQ9kYGzzhZRbK+xOo="。

https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers

但我似乎根本无法重现这些结果。我尝试了许多编码器/解码器,并试图找到上述指令的替代解释,但它们都不起作用。我也没有找到任何这样做的代码示例。

输入:dGhlIHNhbXBsZSBub25jZQ==

魔线(永不改变):258EAFA5-E914-47DA-95CA-C5AB0DC85B11

输出:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

我得到正确答案的唯一方法是通过this site。似乎 SHA1 编码错误,但整体 64 位答案是否正确?无论如何,我们将不胜感激。

【问题讨论】:

您可以随时look at what others did。它可以帮助你弄清楚逻辑。 【参考方案1】:

伪代码:

sec_websocket_key = "dGhlIHNhbXBsZSBub25jZQ=="
magic_string = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
return base64(sha1(sec_websocket_key .. magic_string))

假设您安装了 OpenSSL,这是一个可以在 UNIX shell 中运行的真实实现:

SEC_WEBSOCKET_KEY="dGhlIHNhbXBsZSBub25jZQ=="
MAGIC_STRING="258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
echo -n "$SEC_WEBSOCKET_KEY$MAGIC_STRING" \
    | openssl sha1 -binary \
    | openssl base64

确保您使用的是 SHA1(而不是 SHA256),并且您使用的实现返回的是原始数据,而不是十六进制摘要。哈希函数的输出应该是 160 位(20 字节)长。

另外,请记住,尽管 Sec-WebSocket-Key 看起来像 Base64 数据,您不需要对其进行解码。它按原样包含在哈希中。

【讨论】:

以上是关于Websocket 服务器握手响应的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket是什么?

Python 服务器 Websocket 握手响应

为啥客户端不接受我的 WebSocket 响应握手?

websocket失败:WebSocket握手期间出错:意外响应代码:400

WebSocket 握手期间出错:意外的响应代码:302

NextJS,Express,WebSocket 握手期间出错:意外响应代码:200