【问题标题】:How to Create Secure(TLS/SSL) Websocket Server如何创建安全(TLS/SSL)Websocket 服务器
【发布时间】:2015-09-29 02:15:36
【问题描述】:

我正在使用 WS websocket node.js 库。目前我正在运行 ws 服务器。现在我想通过使用安全连接来保护这个连接,即通过实现 wss 协议和库支持 TLS 连接。我搜索了一下,发现了这个plain to secure: wss 和这个wss with self signed certificate

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

【问题讨论】:

  • 感谢您提供第二个链接。我发布的答案就是基于它。

标签: node.js web-services security ssl websocket


【解决方案1】:

要在 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免费获得一个

【讨论】:

    【解决方案2】:

    你的问题 #1

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

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

    问题

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

    解决方案

    基本上,您提供的第二个链接几乎涵盖了我需要知道的所有内容。不过,这里有几件事我花了一些时间才弄清楚:

    • 为此我需要.pem 文件,但我从证书提供者那里得到的只是一个简单的.crt/.cert 文件,而且我还有一个私人.key 在生成初始@987654336 后得到@ 要求。所以here's how to convertcreditslf):

       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

    【讨论】:

    • Let's Encrypt 的免费证书肯定能胜任这项工作。 [letsencrypt.org]
    • 你知道是否可以重复使用同一个 https 服务器从 wss:// 和 https:// 访问?
    • @shaikmoed 已替换为网络存档副本,感谢您的提醒
    • @jayarjo 是的,我得到的最接近的是 1)。 var httpsServer = https.createServer({key: fs.readFileSync('./privkey.pem', 'utf8'), cert: fs.readFileSync('./fullchain.pem', 'utf8') }, function( req, res ) {res.writeHead(200);res.end('<b>Hello World!</b>');}).listen(443); 然后是 2)。 var wss = new ws({server: httpsServer});httpsServer = null;
    • 如果这不起作用,并且您“知道”您的证书是有效的,请通过使用a tool like this one 解码证书来确保它实际上加载了正确的证书。我以为我正在加载我的实际 Letsencrypt 证书。但不知何故,我把文件路径弄混了,正在加载我附近的一个自签名文件。
    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2017-04-02
    • 2019-04-19
    • 2020-03-17
    • 2018-04-06
    • 2022-10-07
    • 2021-12-13
    相关资源
    最近更新 更多