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

Jay*_*ard 16 javascript amazon-ec2 amazon-web-services 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   ?
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

wss://[internal ip]:4433/projects/socket
Run Code Online (Sandbox Code Playgroud)

这会改变错误:

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

这个错误对我来说很有意义,因为外部世界无法获得内部IP.

我在AWS上的websockets上阅读的所有内容都涉及ELB(Elastic Load Balancer),而我不需要其中的一个.我已经尝试了所有当前发布的答案中的所有内容(有些问题甚至没有得到答案),但无济于事.我还设置了亚马逊(近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                :::*                                -
Run Code Online (Sandbox Code Playgroud)

有人在AWS上遇到类似的websockets问题吗?如果是这样,你是如何解决这个问题的?

Jay*_*ard 19

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

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

一旦我libssl安装了,我就能够重建Haskell服务器,并指向新的证书.一旦证书"匹配",websocket问题就消失了.

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

另一篇StackOverflow帖子提供了一些在此过程中提供巨大帮助的线索.更具体地说这个警告 -

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