当ws://更改为wss://时,Websocket服务器未获得握手

  • 本文关键字:服务器 Websocket ws wss websocket
  • 更新时间 :
  • 英文 :


我们完全陷入了困境,希望得到一位从事WSS工作并了解一些云基础设施的人的帮助。

我们以类似的风格构建了一个自定义的websocket服务器。服务器在Azure中的VM上运行,端口为45001。客户是我们的网站(HTML/Javascript)。websocket uri为"ws://endpointname:45001"服务器将获得握手请求并发送适当的响应,然后建立连接。客户端和服务器之间的交流很愉快!

当我们在Azure上托管网站的位置安装SSL证书时,浏览器要求我们转换ws调用wss://。通过这样做,到达服务器端口的第一条HTTP升级请求消息现在是服务器无法理解的加密消息!!!

//Used to convert the first messages to string. The string used to be the handshake request
//But when connected via wss, this string is meaningless gibberish.
String data = Encoding.UTF8.GetString(bytes); 

你知道为什么服务器虚拟机没有收到HTTP升级请求吗?

我们尝试过的东西:

  1. 已在VM的端口45001上安装证书。运气不好。甚至不确定虚拟机如何知道使用此证书进行解密
  2. 在本地运行服务器,并让浏览器通过wss连接。服务器仍然收到奇怪的加密消息。在当地环境中,基于什么

如果有人能帮忙,我将不胜感激。!!!

HTTP和HTTPS通常用于不同的端口(默认情况下分别为80和443)。安全WebSocket客户端必须连接到服务器并建立HTTPS会话,然后才能发送正常的WS升级请求。

如果您尝试在同一个端口上运行HTTP和HTTPS,大多数服务器将无法正确处理,除非它们专门设计用于查看新连接的前几个字节,以确定是否正在使用HTTPS。通常只使用单独的端口更容易,一个专用于HTTP,一个专门用于HTTPS。

在您的情况下,听起来您的WSS客户端仍在连接到不安全的WS端口,因此服务器将看到HTTPS加密握手,而不是未加密的HTTP请求。HTTPS握手是一种二进制协议,而不是文本协议,所以如果你试图将其视为文本,它会显得像胡言乱语。

端口45001不是标准的HTTP/S端口,因此必须在ws://wss:// URL中明确指定它。您需要更新wss:// URL以使用服务器已配置为支持HTTPS的端口。

相关内容

  • 没有找到相关文章

最新更新