当前位置: 首页 > 知识库问答 >
问题:

如何让服务器返回正确的Sec WebSocket Accept标头值?

俞涵涤
2023-03-14

我似乎得到了错误的哈希值通过我的webSocket键。据我所知,套接字的客户端工作,因为当我让它连接到其他服务器时,它是成功的。

指数js

const http = require('http')
const cryp=require('crypto')
const port = 8080
var ourHTML=require('fs').readFile("index.html",(err,data) => {
        if(err) throw err;
        ourHTML = data.toString();
    });

const requestHandler = (request, response) => {
    //console.log(request)
    response.end(ourHTML)
}

const server = http.createServer(requestHandler)

server.on('upgrade',(req,socket)=>{
    if(req.headers['upgrade'] !== 'websocket'){
        socket.end('HTTP/1.1 400 Bad Request');
        return;
    }
    const hash=getAVal(req.headers['sec-websocket-key']);
    console.log(hash);
    socket.write([
        "HTTP/1.1 101 Web Socket Protocol Handshake",
        "Upgrade: WebSocket",
        "Connection: Upgrade",
        `Sec-WebSocket-Accept: ${hash}`
    ].join('\r\n')+'\r\n\r\n');
    //socket.end();
});

function getAVal(key){
    console.log(key);
    return cryp
    .createHash('sha1')
    .update(key+'258EAFA5-E914–47DA-95CA-C5AB0DC85B11', 'binary')
    .digest('base64');
}

server.listen(port, (err) => {
    if(err){
        return console.log("Uhh ohh,  "+err.stack,err)
    }
    console.log("server listening at "+port)
})

指数html

<html>
<head><title>Local Server</title></head>
<body><h1>Local Server Body</h1><p id="p">To Change</p></body>

<script>
console.log("here");
var ws=new WebSocket("ws://10.0.0.150:8080");
//var ws=new WebSocket("wss://echo.websocket.org");
setInterval(req,1000);

function req(){
    ws.send("tickReq");
}

ws.addEventListener('open', () => {
    ws.send("Hello");
});

ws.addEventListener('message', event => {
    document.getElementById("p").innerHTML=event.data;
});

</script>

</html>

运行时密钥和哈希对的示例如下:

PxsrStN1CGLK/JBYydUFjg==

QAK TE6u sV705GI LpP4yKM04Y=

顶部是浏览器给出的键,底部是getAVal函数返回的值,它是不正确的,导致此消息

WebSocket握手过程中的错误:不正确的'Sec-WebSocket-接受'标头值

共有1个答案

陈俊誉
2023-03-14

在您的示例中,Base64字符串

"QAK+TE6u+sV705GI+LpP4yKM04Y=" 

解码为字节

4002BE4C4EAEFAC57BD39188F8BA4FE3228CD386

但是,字符串的正确SHA1哈希值

"PxsrStN1CGLK/JBYydUFjg==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

是字节

2FEA5BE3299C27C3DD290853435C7529BBBC0F0F

这些字节的base64编码形式是

"L+pb4ymcJ8PdKQhTQ1x1Kbu8Dw8="

这意味着你的SHA1哈希一开始就错了。

尝试调用digest()而不指定编码,这样您就可以得到一个Buffer而不是一个字符串,然后验证它与上面的字节匹配。

然后使用缓冲区将这些字节转换为base64。toString(“base64”)并验证它是否与上面的字符串匹配。

 类似资料:
  • 我花了很多时间尝试在这个问题的帖子中找到的各种想法,但没有成功。当我使用curl时,我会得到所需的头:content-length。 这里是我的最新尝试(在SO的某处找到): 它返回这些头: Key:Vary:Accept-Encoding,User-Agent Key:Server:Apache/2.4.12 Key:Connection:Keep-Alive Key:Last-Modified

  • 我使用泽西API进行我的REST服务。我的问题是:是否有更优雅的方式以JSON形式返回异常?最好是自己创建一个json对象并将其直接附加到响应中? 这是服务中一种方法的简化示例。如您所见,我使用HashMap只是因为该方法可能引发异常,在这种情况下,我需要返回有关它的信息。

  • 问题内容: 我正在尝试使游戏服务器在一段时间后更新。 当我这样做时,python在其中一个内核上消耗了100%的计算能力。我真的不明白为什么会这样,如果可能的话如何解决。 问题答案: 在每次轮询之间插入一个10毫秒的毫秒,否则您的循环将持续轮询时间,而不会释放CPU的电源。 编辑:更好,仅在需要时等待一次。如果发生严重的CPU过载,则等待时间可能为负,在这种情况下,可以立即触发2个操作。并不断地重

  • 我正在netty之上编写客户机-服务器应用程序。 我从一个简单的客户端登录服务器开始,该服务器通过数据库验证从客户端发送的信息。这一切都很好。 在客户端,我希望在收到来自服务器的响应后使用If语句,以确定登录凭据是否有效。这也很好用。我的问题是ChannelRead方法不返回任何内容。我不能改变这个。我需要它返回一个布尔值,允许登录尝试成功或失败。 一旦返回,我就会丢失数据的内容。 我尝试将msg

  • 问题内容: 我需要从 网址获得回调后关闭服务器。使用通常的 HTTP API, 关闭服务器当前支持 API功能,但是使用节点表达服务器时 出现错误。而且我不知道如何找到解决此问题的信息。 我应该如何关闭快递服务器? NodeJS配置说明: 实际应用代码: 另外,我发现[‘nodejs expressclose…’,]但是我不确定是否可以将其用于具有以下代码的代码中:。 问题答案: 返回。您应该在该

  • 我已经阅读了很多Java8可选版本,我确实理解这个概念,但在我的代码中尝试实现它时仍然会遇到困难。 虽然我在网上搜索了一些好的例子,但我没有找到一个解释得很好的例子。 我有下一个方法: 这个简单的方法通过传递文件路径来返回文件的md5。正如您所注意到的,如果文件路径不存在(或键入错误),将抛出NoSuchFileException,该方法返回Null。 我希望使用Optional,而不是返回nul