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

Posted

技术标签:

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

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

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

【问题讨论】:

感谢您提供第二个链接。我发布的答案就是基于它。 【参考方案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 convert(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
 );

参考文献

github.com/websockets/ws/blob/master/examples/ssl.js chovy.com/web-development/self-signed-certs-with-secure-websockets-in-node-js

你的问题 #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 证书。但不知何故,我把文件路径弄混了,正在加载我附近的一个自签名文件。

以上是关于如何创建安全(TLS/SSL)Websocket 服务器的主要内容,如果未能解决你的问题,请参考以下文章

SSL与TLS原理(未完成)

SSL与TLS原理(未完成)

重识Nginx - 12 SSL/TLS 浅析

重识Nginx - 12 SSL/TLS 浅析

TLS(SSL)

ssl支持的协议都有哪些,有啥用?