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

WebSocket握手-WebSocket握手过程中出错:不正确的'Sec-WebSocket-Access'标头值

华乐逸
2023-03-14

我正在使用Python的套接字来响应Websocket请求,并且我面临着Sec Websocket Accept头的问题。以前可能有过类似的问题,但没有人为我工作

文档位于https://developer.mozilla.org声明对于要建立的连接:

服务器获取握手请求中发送的Sec-WebSocket-Key的值,追加258EAFA5-E914-47DA-95CA-C5AB0DC85B11,获取新值的SHA-1,然后对其进行Bas64编码。

我当前发送的响应封装在一个函数中,该函数从请求中获取密钥,并执行文档中所述的操作

def socket101(self,template,key):
    key = key.strip()
    key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" #Add the key
    key = sha1(key.encode()).digest() #Take the sha1
    key = b64encode(key) #B64 encode it
    return (b"HTTP/1.1 101 Switching Protocols\n"
            +b"Content-Type: text/html\n"
            +b"Connection: Upgrade\n"
            +b"Upgrade: websocket\n"
            +"Sec-WebSocket-Accept: {}\n".format(key).encode()
            +b"\n"
            )    

然后我调用上面的方法如下

def AwaitMessage(client,address):
    while True:
        data = client.recv(1024)
        try:
            if str(data.strip()) != '': 
                headers = ParseHeaders(data) #Parses the request headers
                HTTP_MSG = socket101(headers['Sec-WebSocket-Key']) #Call the function above passing the key
                client.send(HTTP_MSG) #Send the message
        except Exception as f:
              pass
    client.close()

但这不希望我做任何事情,并抛出以下错误:

WebSocket握手期间出错:“Sec WebSocket Accept”标题值不正确

浏览器没有提供任何关于它为什么不正确的信息,我猜不出来。

JavaScript代码只是与套接字建立连接。

const host = window.location.host
const PORT = 8000;
const socket = new WebSocket(`ws://${host}:${PORT}/ws/connection`)

有什么想法吗?

共有1个答案

巢德华
2023-03-14

下面的代码对我有用

from base64 import b64encode 
from hashlib import sha1

key = b64encode(sha1((key + GUID).encode()).digest()) #This
return (b"HTTP/1.1 101 Switching Protocols\n"
        +b"Content-Type: text/html\n"
        +b"Connection: Upgrade\n"
        +b"Upgrade: websocket\n"
        +b"Sec-WebSocket-Accept: " + key + b"\n" #Maybe this did something?
        +b"\n"
        )    

我几乎可以肯定,这是完全一样的东西,我有上面,但上述不工作。

编辑:问题是type(key)bytes,因此f'{key}'将引号环绕它,但在上面的代码段中,它与其他bytes连接在一起。

 类似资料:
  • 我正在用C编写一个websocket服务器,无法让握手正常工作。Chrome报告错误是由于错误的accept头,但我相信该值是正确的。 作为exchange的一个示例,客户端发送以下密钥: 我的服务器会发回: 我已经根据RFC中的示例测试了我的服务器,并进行了验证。我不知道为什么不被接受。我的理论是,我必须做一些其他事情,产生与坏接受值相同的错误。 以下是不同于wireshark捕获的请求: 以下

  • 我正在使用Windows server 2019,反向代理配置为ARR 3,并使用节点托管我的项目。js和socket。io,我正在重定向网站至内部地址。 当我尝试访问网站时在服务器套接字内。io正在工作,但当我尝试使用外部地址访问网络外部的网站时,我收到了错误消息 Web套接字握手期间出错:“Sec WebSocket Accept”标头值不正确

  • 我正在写一个c websocket服务器,chrome上的开发工具说SecWebSocket接受头值不正确。我已经测试了好几天了,一切似乎都很好。客户端使用readystate 3关闭,而不调用websocket onopen,尽管它在chrome开发工具中显示为101。 这是我计算钥匙的代码 铬反应 Chrome请求 它表示"WebSocket握手过程中出错:不正确的'Sec-WebSocket

  • ASP.NET 5 RC1上的信号器3-RC1用户 尝试运行websocket时出现以下错误。 使用Chrome50.0.2661.87 标题如下: 请求标题: 日期:2016年4月29日星期五13:51:54 GMT 服务器:Kestrel 传输编码:分块 升级:websocket X-Content-Type-Options:nosniff X-Powered-By:ASP.NET 响应头:

  • 我有一个使用WinSock2的cpp服务器,我试图用我的javascript客户端连接到这个服务器,但它不起作用,chrome控制台说“WebSocket握手过程中出错:不正确的‘Sec-WebSocket-Access’标头值”。我把我的sha1和bas64函数与在线进行了比较Sha1和Base64,所以问题不在这里。 Chrome响应报头: Chrome请求头: 服务器代码: 客户代码:

  • 我正在制作一个有游戏的网站。对于游戏,我需要发送数据。加载页面时一切正常,但我无法让握手生效。 socketReq变量存在是因为我不希望任何人直接从浏览器连接到localhost:25580。我的发送和接收功能在不同的线程中,它们将在握手后启动。 JS中新WebSocket(ws://localhost:25580)的结果是 到“ws://localhost:25580/”的WebSocket连接