我们完全陷入困境,并且非常喜欢那些从事过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升级请求的任何想法?
我们尝试的事情:
如果有人能提供帮助,真的很感激。!!!
答案 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的端口。