WebSocket/Node.js 帮助:无法建立到 wss://domain:8080 的连接 - 不是特定于浏览器的

Posted

技术标签:

【中文标题】WebSocket/Node.js 帮助:无法建立到 wss://domain:8080 的连接 - 不是特定于浏览器的【英文标题】:WebSocket/Node.js help: Can't establish a connection to wss://domain:8080 - NOT browser specific 【发布时间】:2021-07-05 14:01:33 【问题描述】:

您好,很抱歉我的第一个堆栈溢出问题,所以我会尽力而为。我已经阅读了数十个相关问题,但似乎没有一个能够为我提供答案。

我最近开始使用 Node.js,因为我需要 websockets 来实现我网站上的某些功能,而 Node.js 似乎是流行的选择。我的网站通过 LetsEncrypt 获得了 SSL 证书,因此我已将证书和密钥文件添加到我的 WSS 配置文件“index.js”中,如下所示:

const fs = require("fs");
const https = require("https");
const WebSocket = require("ws");

const server = https.createServer(
    cert: fs.readFileSync("/etc/letsencrypt/live/my_domain.com/cert.pem"),
    key: fs.readFileSync("/etc/letsencrypt/live/my_domain.com/privkey.pem"),
    requestCert: true,
    rejectUnauthorized: false
);

const wss = new WebSocket.Server( server );

wss.on('connection', function connection(ws) 
  ws.on('message', function incoming(message) 
    console.log('received: %s', message);
  );

  ws.send('something');
);

server.listen(8080, () => console.log("Listening on port :8080"))

当我通过终端在我的服务器上节点 index.js 时,我没有收到任何错误,并且它按预期输出:'Listening on port :8080'。然后,当我导航到一个简单的 index.html 页面时,我测试它是否使用以下代码:

<script>
    const socket = new WebSocket("wss://my_domain.com:8080");

    socket.addEventListener("open", function (event) 
        console.log("We are connected!");

        ws.send("Hi! I've connected!");
    );

    socket.addEventListener("message", function (event) 
        console.log(e.data);
    );
</script>

我只是在浏览器中收到以下控制台错误:

火狐:

Firefox 无法与位于 wss://my_domain.com:8080/ 的服务器建立连接。

铬:

到 'wss://my_domain.com:8080/' 的 WebSocket 连接失败: (匿名)@index.html:60

我在网络检查器工具中看不到任何其他详细信息,但如果有什么我可以提供的额外说明/上下文,请询问,我会尽快回复。

编辑:This article 被建议但似乎没有解决问题:在他们的问题中,它适用于 chrome 但不适用于 Firefox,我的尚未在任何浏览器中工作。同样在该帖子的答案中,他们建议转到“同一服务器上的正常页面”以接受证书,但我似乎无法在我的任何页面上触发对话框。

我也认为我的证书不是自签名的,因为所有这些帖子似乎都是,但老实说我不知道​​:

证书信息截图

【问题讨论】:

这能回答你的问题吗? Can not established Websocket secure connection on Firefox @James No- 在他们的问题中,它可以在 chrome 中运行,但不能在 Firefox 中运行,我的还没有在任何浏览器中运行。同样在该帖子的答案中,他们建议转到“同一服务器上的正常页面”以接受证书,但我似乎无法在我的任何页面上触发对话框。 这可能表明存在问题 - 访问 websocket 端点时,您的浏览器将不接受服务器上的 SSL 证书。我对该错误消息所做的所有谷歌搜索都指向证书。 @James 所有这些文章都指的是自分配证书。老实说,我对 SSL 证书了解不多,但我刚刚检查了我的证书详细信息,它显示颁发者为 Let's Encrypt。这是否意味着它不是自分配的,因此所有这些答案都无关紧要? Let's encrypt 不是自签名的。在浏览器中访问 https://my_domain.com:8080/ 时是否遇到类似错误? 【参考方案1】:

经过数小时试图找到复杂问题的复杂答案后,它最终变成了一个简单的防火墙问题,所以我想我会回来发布为我解决的问题,以防其他人将来遇到类似问题。

我只是在服务器上运行了以下命令:

 ufw allow 3000/tcp

祝大家好运:)

【讨论】:

以上是关于WebSocket/Node.js 帮助:无法建立到 wss://domain:8080 的连接 - 不是特定于浏览器的的主要内容,如果未能解决你的问题,请参考以下文章

细说WebSocket -- Node.js篇

WebSocket+Node.js+dGram+Vue 入门级小系统

WebSocket实践

如何通过Websocket将arraybuffer作为二进制发送?

wordpress 建立数据库连接时出错,页面无法显示

无法为 ssl/tls 权限建立安全通道