NodeJS 安全 Websocket 不会附加到 https

Posted

技术标签:

【中文标题】NodeJS 安全 Websocket 不会附加到 https【英文标题】:NodeJS Secure Websockets will not attach to https 【发布时间】:2021-08-05 14:52:19 【问题描述】:

在过去的 2 天里,我试图让一个超级基本的 wss:// 在 NodeJS 中运行,我快疯了。我已经尝试了很多方法和库,但似乎无法将 websocket 服务器附加到 https 实例。我可以毫无问题地利用常规的旧 http 并将其附加到该实例。我的调试控制台中没有任何错误。

我已经创建了两个自我风格的类型证书(创建密钥 + CA,创建 CSR, 签名,使用新的服务器证书)和(创建密钥 + 自签名证书, 使用它们)。 我尝试通过 env var 禁用 TLS 验证: NODE_TLS_REJECT_UNAUTHORIZED="0" 我已经尝试过 ws 和 websocket 库以及许多不同的组合 基本 ws 创建与服务器附加方法的比较。 我已经搭建了一个Ubuntu 21.04的VM,安装了依赖和vscode 只是为了排除我的操作系统。同样的问题。 尝试使用节点版本 14 + 16。

:包部门:

"websocket": "^1.0.34",
"ws": "^8.0.0"

:server.js:

const fs = require('fs');
const WebSocket = require('ws');

//HTTPS
const https = require('https');
const server = new https.createServer(
    key: fs.readFileSync('./config/certs/key.pem'),
    cert: fs.readFileSync('./config/certs/cert.pem')
);
    
//HTTP
// const http = require('http');
// const server = new http.createServer();


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('hello from server!, the time is: ' + timestamp());
    );
);


//Helper function to create a timestamp
function timestamp() 
    return (new Date)
        .toISOString()
        .replace(/z|t/gi, ' ')
        .trim()
;

//Start the server
server.listen(3000);

我怀疑节点和依赖项之间存在一些潜在的兼容性问题或其他什么...任何建议将不胜感激。我对调试内部模块不太熟悉,所以如果有一些命令行开关我应该添加到 node/nodemon 请告诉我。我至少启用了 --inspect 和 --trace-warnings。

【问题讨论】:

【参考方案1】:

我只是想通了,和往常一样,这是一件简单而被忽视的事情。我一直在使用带有 Weasel 客户端插件的 Firefox 来测试 websocket。我已将我的自签名证书与我创建的根 CA 证书一起导入到 Firefox 中。即使它是导入的,我仍然必须导航到 HTTPS 网址并确认美妙的黄色边框弹出窗口。当我点击“接受风险并继续”时,我切换到 Weasel,它建立了与 wss://localhost:3000 的连接,没有任何问题。

即使证书被列入白名单,我仍然会收到警告页面并且必须确认。下一次我会尝试一个不同的客户端,比如用另一种语言(Python、.NET...)构建的客户端。永远不会认为这是一个浏览器问题,但它对 ssl/tls 的工作方式很有意义。

【讨论】:

以上是关于NodeJS 安全 Websocket 不会附加到 https的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs Websocket关闭事件调用......最终

侦听附加端口 Microsoft Azure Nodejs

php websocket转发到nodejs

nodejs没有将websocket发送到浏览器

nodejs-websocket介绍

nodejs websocket检测断开连接的套接字