如何创建安全(TLS/SSL)Websocket 服务器

问题描述 投票:0回答:3

我正在使用node.js的WS websocket库。目前我正在运行 ws 服务器。现在我想通过使用安全连接来保护此连接,即通过实现 wss 协议以及库支持 TLS 连接。我搜索了一下,发现这个很容易保护:wss和这个带有自签名证书的wss

两者都不是很详细,第二个链接上的文章描述了带有自签名证书的wss。我想知道的是,仅创建自签名证书并部署到我的生产环境是否就足够了,还是我需要像创建 HTTPS 服务器时那样购买证书?

node.js web-services security ssl websocket
3个回答
85
投票

你的问题#1

如何创建安全(TLS/SSL)Websocket 服务器?

我在网上搜索有关如何使 Websocket 通过安全连接工作的指南时发现了您的问题。由于此内容出现在搜索结果中,因此我可能不是唯一一个最终出现在该页面上的人。为了节省每个人(包括未来的我)一些时间,就在这里。

问题

我有一个简单的 node.js websocket 服务器,由 einaros/ws 提供支持,通过不安全的连接监听端口 80。必须将其切换为安全连接。

解决方案

基本上,您提供的第二个链接几乎涵盖了我需要了解的所有内容。以下是我花了一些时间才弄清楚的一些事情:

  • 为此我需要

    .pem
    文件,但我从证书提供商那里得到的只是一个简单的
    .crt
    /
    .cert
    文件,而且我还有一个在生成初始
    .key
    后获得的私有
    .csr
    要求。所以这里是如何转换creditslf):

     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
     });
    

参考文献

你的问题#2

我想知道的是,仅创建自签名证书并部署到我的生产环境是否就足够了,还是需要像创建 HTTPS 服务器时那样购买证书?

对于公共服务器,您将需要来自广泛信任的CA的证书。使用免费的 Let's Encrypt 或来自已知发行者的任何付费证书。这将确保您的用户不会收到任何浏览器安全警告,或者在不知道出了什么问题的情况下就离开。

对于您的本地开发环境,或者所有连接客户端均已知且在您的控制之下,您可以创建自己的 CA,请参阅 deliciousbrains.com/ssl-certificate-authority-for-local-https-development


16
投票

要在 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

免费获取一个

0
投票

重要提示:您需要一个单独的 http 服务器用于 wss 服务器

多年来,我一直在努力使用同一个 Node.js 脚本启动 https Web 服务器(在端口 443 上)和 wss 套接字服务器(在端口 2345 上)。

解决方案很简单,你只需添加(一行代码)一个https服务器专门用于wss服务器。

(事实上,您只需为您正在操作的每台 wss 服务器制作一个即可。)

因此,

获取 Letcreate 证书:

在 shell 上创建您的证书。停止您的网络服务器一分钟,然后:

% certbot certonly --standalone

在node.js中

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 )

就是这样完成的。

© www.soinside.com 2019 - 2024. All rights reserved.