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

时间:2016-07-22 02:48:52

标签: websocket

我们完全陷入困境,并且非常喜欢那些从事过WSS并且了解一些云基础架构的人的帮助。

我们以类似于this的样式构建了自定义websocket服务器。服务器在端口45001上的Azure上的VM上运行。客户端是我们的网站(HTML / Javascript)。 websocket uri是'ws:// endpointname:45001'服务器将获得握手请求并发送适当的响应并建立连接。客户端和服务器每次都愉快地沟通!

当我们安装SSL证书时,我们的网站托管在Azure上,浏览器要求我们转换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上安装证书。没运气。不确定VM如何知道使用此证书进行解密。
  2. 在本地运行服务器,让浏览器通过wss连接。服务器仍然有奇怪的加密消息。在当地的环境中,基于什么基础
  3. 如果有人能提供帮助,真的很感激。!!!

1 个答案:

答案 0 :(得分:0)

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

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

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

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