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的主要内容,如果未能解决你的问题,请参考以下文章