WebSocket连接失败:WebSocket打开握手被取消

时间:2015-06-09 12:38:47

标签: javascript amazon-web-services amazon-ec2 websocket

我最近设置了一个EC2实例(在没有负载均衡器的VPC中)并且无可否认配置有点奇怪,但它正是我们运行的Web应用程序所需要的。

Web服务器(在Haskell中)在端口4433上运行(标准端口是为Apache实例保留的),并且正在接收从另一个系统广播的UDP数据包。我有很多端口是开放式的(仅在测试期间),如此处所示(来自安全组):

Custom TCP Rule    4433     tcp 0.0.0.0/0   ✔
Custom TCP Rule    8080     tcp 0.0.0.0/0   ✔
SSH                22       tcp 0.0.0.0/0   ✔
HTTP               80       tcp 0.0.0.0/0   ✔
HTTPS              443      tcp 0.0.0.0/0   ✔
Custom UDP Rule    30090    udp 0.0.0.0/0   ✔
Custom UDP Rule    30089    udp 0.0.0.0/0   ✔

TCP套接字的JavaScript请求在同一端口上设置套接字(使用分配给AWS的公共IP的URL),这是请求返回错误的位置:

  

与'wss:// [URL]:4433 / projects / socket'的WebSocket连接失败:WebSocket打开握手被取消。

将套接字绑定到0.0.0.0会导致相同的错误。

为了启动Haskell Web服务器,我必须引用AWS提供的内部 IP,因为它在引用弹性IP提供的 public IP时不会运行服务。想到这就是问题出现的地方我把套接字请求改为了......

wss://[internal ip]:4433/projects/socket

这会更改错误:

  

与'wss:// [内部IP]:4433 / projects / socket'的WebSocket连接失败:连接建立错误:net :: ERR_CONNECTION_REFUSED

这个错误对我有意义,因为外部世界无法使用内部IP。

我在AWS上的websockets上阅读的所有内容都涉及ELB(弹性负载均衡器),我不需要其中任何一个。我已经尝试了所有当前发布的答案中的所有内容(有些问题甚至没有得到答案),但无济于事。我还在亚马逊(大约24小时前)设置了一个支持案例,但尚未收到回复。

其他信息

导航到http://[URL]:4433/projects/socket会产生'WebSocket Available',其中URL是我们希望使用的URL以及AWS提供的公共DNS。

正在运行netstat -plunt会显示以下内容:

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 [internal IP]:8080      0.0.0.0:*               LISTEN      -
tcp        0      0 [internal IP]:4433      0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::443                  :::*                    LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      -
udp        0      0 [internal IP]:30089     0.0.0.0:*                           -
udp        0      0 0.0.0.0:30090           0.0.0.0:*                           -
udp        0      0 0.0.0.0:11950           0.0.0.0:*                           -
udp        0      0 0.0.0.0:68              0.0.0.0:*                           -
udp6       0      0 :::38450                :::*                                -

AWS上的websockets是否有类似的问题?如果是这样,你是如何解决这个问题的?

3 个答案:

答案 0 :(得分:19)

Haskell服务器和Apache服务器之间存在SSL证书不匹配。

必须使用有关实例的新证书的信息重建Haskell服务器。更复杂的是,EC2实例上没有安装正确的SSL库(libssl0.9.8 libssl-dev),这在重建Haskell服务器期间导致了我的问题。知道EC2实例是一个“空白画布”,使得缺少该安装是我的错。

一旦安装了libssl,我就可以重建Haskell服务器,并指向新证书。一旦证书“匹配”,websocket问题就消失了。

重申一下,我们的情况是独一无二的。我们有一个Apache服务器(端口80和443)和一个Haskell服务器(端口8080和4433),它们相互通信,通过websockets执行pub-sub操作。两个服务器之间的证书不匹配(它不重要的是什么类型,它可能是多个Apache实例)导致SSL警告。来自SSL的任何警告都将删除任何建立或维护websocket的尝试(因此取消了握手消息)。

Another StackOverflow post提供了一些在此过程中提供巨大帮助的线索。更具体地说,这个警告 -

  

问题的关键在于:如果您的SSL证书导致任何类型的警告,wss:// WebSocket连接将立即失败,并且没有规范的方法来检测它。 / p>

答案 1 :(得分:0)

在使用来自file:// URL的基于blob的webworker的websockets时遇到此错误。我怀疑在网络服务器上运行可能会解决这个问题;我在调试时通过关闭SSL解决了这个问题。

答案 2 :(得分:0)

如果websocket网址未正确放入frontend

,可能会发生此错误。

检查此答案websockets in https connection

放置前端网址的正确方法是"wss://example.com/wss/"

放置前端网址的方法错误

wss://example.com:8080/wss/ -> port no should not be mentioned
ws://example.com/wss/ -> url should start with wss only.
wss://example.com/wss -> url should end with / -> most important