我正在使用node.js的WS websocket库。目前我正在运行 ws 服务器。现在我想通过使用安全连接来保护此连接,即通过实现 wss 协议以及库支持 TLS 连接。我搜索了一下,发现这个很容易保护:wss和这个带有自签名证书的wss。
两者都不是很详细,第二个链接上的文章描述了带有自签名证书的wss。我想知道的是,仅创建自签名证书并部署到我的生产环境是否就足够了,还是我需要像创建 HTTPS 服务器时那样购买证书?
如何创建安全(TLS/SSL)Websocket 服务器?
我在网上搜索有关如何使 Websocket 通过安全连接工作的指南时发现了您的问题。由于此内容出现在搜索结果中,因此我可能不是唯一一个最终出现在该页面上的人。为了节省每个人(包括未来的我)一些时间,就在这里。
我有一个简单的 node.js websocket 服务器,由 einaros/ws 提供支持,通过不安全的连接监听端口 80。必须将其切换为安全连接。
基本上,您提供的第二个链接几乎涵盖了我需要了解的所有内容。以下是我花了一些时间才弄清楚的一些事情:
为此我需要
.pem
文件,但我从证书提供商那里得到的只是一个简单的 .crt
/.cert
文件,而且我还有一个在生成初始 .key
后获得的私有 .csr
要求。所以这里是如何转换(credit到slf):
openssl rsa -in server.key -text > private.pem
openssl x509 -inform PEM -in server.crt > public.pem
我不清楚如何使
ws
使用安全连接。由于我尝试将 SSL 添加到现有应用程序中,因此我想避免重新执行操作。事实证明,我所要做的就是将 {port:80}
参数替换为对 https
实例的引用(有关如何初始化它的更多信息,请参阅链接)。
var ws = require('ws').Server;
var wss = new ws({
server: httpsServer
});
我想知道的是,仅创建自签名证书并部署到我的生产环境是否就足够了,还是需要像创建 HTTPS 服务器时那样购买证书?
对于公共服务器,您将需要来自广泛信任的CA的证书。使用免费的 Let's Encrypt 或来自已知发行者的任何付费证书。这将确保您的用户不会收到任何浏览器安全警告,或者在不知道出了什么问题的情况下就离开。
对于您的本地开发环境,或者所有连接客户端均已知且在您的控制之下,您可以创建自己的 CA,请参阅 deliciousbrains.com/ssl-certificate-authority-for-local-https-development。
要在 NodeJS 中使用安全 Web 套接字,请使用以下代码示例:
const WebSocket = require("ws").Server;
const HttpsServer = require('https').createServer;
const fs = require("fs");
server = HttpsServer({
cert: fs.readFileSync(config.ssl_cert_path),
key: fs.readFileSync(config.ssl_key_path)
})
socket = new WebSocket({
server: server
});
socket.on(...);
server.listen(config.port);
如果您还没有 ssl 证书 - 您可以从 letsencrypt.org
免费获取一个多年来,我一直在努力使用同一个 Node.js 脚本启动 https Web 服务器(在端口 443 上)和 wss 套接字服务器(在端口 2345 上)。
解决方案很简单,你只需添加(一行代码)一个https服务器专门用于wss服务器。
(事实上,您只需为您正在操作的每台 wss 服务器制作一个即可。)
因此,
在 shell 上创建您的证书。停止您的网络服务器一分钟,然后:
% certbot certonly --standalone
const cts = {
cert: fs.readFileSync("/etc/letsencrypt/-blah-/fullchain.pem"),
key: fs.readFileSync("/etc/letsencrypt/-blah-/privkey.pem")
}
// create https (443)
app = express()
app.use .. etc etc
app.get .. etc etc
https.createServer(cts, app).listen(443)
// bounce http (80)
const bounce = express()
bounce.get("*", (req, res, next) => {res.status(403)})
appHttpBounce.listen(80)
// create https SPECIFICALLY FOR wss (2345)
let for_2345 = https.createServer(options).listen(2345)
let wss = new WSServer({
server: for_2345,
perMessageDeflate: false
})
wss.on( etc etc )
// create https SPECIFICALLY FOR wss (2666)
let for_2666 = https.createServer(options).listen(2666)
let wss_admin = new WSServer({
server: for_2666,
perMessageDeflate: false
})
wss_admin.on( etc etc )
就是这样完成的。