javascript - 错误设置 wss 服务器 : works on localhost, 但不是 IP 地址

标签 javascript node.js ssl websocket ws

我在 node.js 中设置 wss 服务器(安全 Websocket 服务器)时遇到问题。 当我们运行服务器并使用 online websocket tester 对其进行测试时并连接到 wss://localhost:8888 就可以了。但是当我们连接到 wss://my_ip:8888(使用 ifconfig 找到的 ip)时,它会导致错误 index.js:15 WebSocket connection to 'wss ://192.168.1.217:8888/'失败

我创建了一个 git 存储库以便于测试:https://github.com/DaanS8/wss_error

可能有用的信息

我们使用 telnet my_ip 8888 ping 端口 8888 上的 ip,结果成功。任何其他端口发生故障,这意味着它正在监听?

Chrome 的行为与 Firefox 不同,在 chrome localhost 中可以工作,但在 Firefox localhost 中甚至不能工作,同时在在线 websocket 测试器上使用相同的测试。

代码在 Windows 机器上的 ubuntu 虚拟机上运行。似乎 ubuntu 虚拟机没有自己的防火墙(sudo ufw status 导致错误),只是关闭 windows 防火墙并没有改变错误。

证书是使用以下命令生成的:

openssl genrsa -des3 -out myCA.key 2048
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem
      Enter pass phrase for myCA.key:
      Country Name (2 letter code) [AU]:BE
      State or Province Name (full name) [Some-State]:Vlaams-Brabant
      Locality Name (eg, city) []:Leuven
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:KU Leuven
      Organizational Unit Name (eg, section) []:Pno
      Common Name (e.g. server FQDN or YOUR name) []:Team x
      Email Address []:xxxx@xxxxxxxx.be

openssl rsa -in myCA.key -text > private.pem

我的主要来源:

代码

main.ts:

// Minimal amount of secure websocket server
var fs = require('fs');

// read ssl certificate
var privateKey = fs.readFileSync('certs/private.pem', 'utf8');
var certificate = fs.readFileSync('certs/myCA.pem', 'utf8');

var credentials = { key: privateKey, cert: certificate };
var https = require('https');

//pass in your credentials to create an https server
var httpsServer = https.createServer(credentials);
httpsServer.listen(8888);

var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({
    server: httpsServer
});

wss.on('connection', function connection(ws) {
    ws.on('message', function incoming(message) {
        console.log('received: %s', message);
        ws.send('reply from server : ' + message)
    });

    ws.send('something');
}); 

参见 github key 等

最佳答案

您的“在线 websocket 测试器”没有提供易于阅读的源代码,因此不清楚是什么地方失败了。我的猜测:TLS 证书验证失败。 (浏览器可能有自己的 localhost 规则,因此在某些浏览器中它可能适用于 localhost)。

您正在连接到 IP,但已生成证书 Common Name: Team x。正确的 TLS 客户端实现应该拒绝这种 TLS 连接,因为服务器名称与 TLS CN 名称不匹配('IP'!='Team x')。

解决方案:

1.) 生成正确的 TLS 证书,其中 Common Name 匹配使用的 IP。这是适合您的用例的安全解决方案(通常使用服务器 FQDN,因为域用于连接而不是服务器 IP)。

2.) 使用 websocket 客户端,它提供了禁用证书验证的选项。

3.) 打开 https://IP:8888 并为使用的证书添加浏览器 TLS 异常(exception)。异常(exception)也应该适用于 wss 协议(protocol)。

关于javascript - 错误设置 wss 服务器 : works on localhost, 但不是 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71401167/

相关文章:

javascript - 如何从标准 JavaScript 日期中仅提取日/月/年?

javascript - Nuxt 打开链接到模态

javascript - 尝试使用 Nodejs 从 HTML 响应中提取信息

zend-framework - htaccess https 仅在特定的 Zend Frameworks Controller /操作上重定向

javascript - NODE.js 和 JavaScript;从串行端口获取一行然后关闭

javascript - Drupal 7 - Javascript 与 Google map 自动完成的集成问题

Node.js 后台处理

javascript - 带有 TypeScript 4.4.2 和 @types/node 16.7.10 抛出错误类型的 AWS JavaScript SDK v3

security - 高级 SSL : Intermediate Certificate Authority and deploying embedded boxes

security - 如何安全地将数据作为 URL 中的参数发送?