gpt4 book ai didi

javascript - WebSocket 连接失败 : WebSocket opening handshake was canceled

转载 作者:可可西里 更新时间:2023-11-01 01:24:34 25 4
gpt4 key购买 nike

我最近设置了一个 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 公共(public) IP 的 URL),这就是请求返回错误的地方:

WebSocket connection to 'wss://[URL]:4433/projects/socket' failed: WebSocket opening handshake was canceled.

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

为了启动 Haskell Web 服务器,我必须引用 AWS 提供的内部 IP,因为在引用弹性 IP 提供的公共(public) IP 时它不会运行服务。认为这就是问题所在,我将套接字请求更改为此...

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

这改变了错误:

WebSocket connection to 'wss://[internal IP]:4433/projects/socket' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

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

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

附加信息

导航到 http://[URL]:4433/projects/socket 会产生“WebSocket 可用”,其中 URL 是我们希望使用的 URL 以及 AWS 提供的公共(public) 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 问题吗?如果是,您是如何解决问题的?

最佳答案

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

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

一旦我安装了 libssl,我就能够重建 Haskell 服务器,让它指向新的证书。一旦证书“匹配”,websocket 问题就消失了。

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

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

The key to the problem is this: If your SSL certificate causes a warning of any sort, wss:// WebSocket connections will immediately fail, and there is no canonical way to detect this.

关于javascript - WebSocket 连接失败 : WebSocket opening handshake was canceled,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30732269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com