javascript - Node.js 和 Socket.io : Self-signed certificates for a secure websocket connection

标签 javascript node.js security sockets socket.io

我一直在网上寻找直接的答案,但大多数解决方案都涉及使用 Express 和提供 HTTP 内容以实现安全连接。我对 Node.js 和 socket.io 的安全网络套接字连接 (wss) 更感兴趣

我不使用 Node.js 进行 HTTP 请求。我使用与 Node.js 配合使用的 socket.io 模块将消息实时传递到我的应用程序。我只将 Node 用于网络套接字连接。

我将简要说明我的设置是什么。我使用 Django 作为我的 HTTP 后端。用户向 Django 发出请求,Django 将该请求的内容转发给 Redis,Node.js 监听 Redis 的一个 channel ,它处理内容并将消息发送给适当的接收者。

非常简单直接。一切正常。但我担心与 Node.js 的 websocket 连接不安全。当 Node.js 向接收者发送消息时,我不希望任何人在中间窥探并拦截消息。我想确保我的用户感到安全并信任我为他们构建的服务。

我查看了自签名证书和来自 CA 的证书。两者都提供相同级别的安全性。由于我只将 Node.js 用于 socket.io 而不是提供 HTTP 内容,因此自签名证书绝对可以正常工作(我构建的服务是针对移动设备的,而不是针对浏览器的!)

下面是我对socket.io的实现:

var io = require('socket.io').listen(8000);
var redis = require('socket.io/node_modules/redis')
var redisChannelConnection = redis.createClient(6000, "12.345.678.9");
var redisServer = redis.createClient(6000, "23.456.789.1");

// Subscribe to Redis Channel
redisChannelConnection.subscribe('messages');

io.sockets.on('connection', function (socket) {
     socket.emit('message', 'Hello World');
     }

到目前为止,我刚刚编写了一个简单的连接函数。它作为一个普通的 websocket 连接工作。但我想让它成为一个安全的 websocket 连接。我做了多少?

感谢您的帮助。

最佳答案

首先你需要在node中创建一个HTTPS服务器(你需要一个证书):

http://nodejs.org/api/https.html
How to create an HTTPS server in Node.js?

然后您应该使用该服务器来启动 Socket.io。

var io = require('socket.io').listen(myHTTPSserver);

基本上就这些了。<​​/p>

有两种方法可以保护您的连接免受中间人攻击:

  • 使用签名证书,并让客户端检查该签名。互联网上充斥着关于为什么这实际上是一个非常糟糕的解决方案的解释。
  • 确保客户端拒绝连接除您的证书以外的任何内容。任何体面的 SSL/TLS 库都将允许您指定必须用于传出连接的证书,如果服务器端的 key 与该证书不匹配,则连接将中止。这会做签名系统应该做的所有事情,但不依赖于世界上每个 CA 证书都是诚实的,也不依赖于 CA 系统的任何其他缺点。

您的 Django/Node.js 组合听起来很奇怪,是否正确理解客户端在一个 channel 上发出请求并在另一个 channel 上接收响应?

虽然从技术上讲它可能没问题,但这听起来像是制造奇怪漏洞的秘诀。如果您必须同时使用两者,请考虑让 Node 成为 Django 内容的代理,并让 Node 处理所有身份验证。

无论如何,我严重怀疑只加密两个 channel 之一就足够了,一旦黑客入侵了一个 channel ,很可能会有过多的升级选项。

关于javascript - Node.js 和 Socket.io : Self-signed certificates for a secure websocket connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22593949/

相关文章:

node.js - 使用 Nodejs 的 Xmpp ejabberd 自定义身份验证

javascript - 可以在 Base64 图像中隐藏脚本

javascript - for循环内的for循环弄乱了变量

javascript - Highcharts 像选择一样留下选择

javascript - 将一个键的值和值添加到数组中的另一个属性

java - 安全策略文件和jar

c# - IOException : "A required privilege is not held by the client." best way to overcome?

javascript - 使用 yup 使用数组进行 Formik 和 Yup 表单验证

ios - 将 localhost 与 Flutter 结合使用并使用 iOS 设备进行测试

json - 获取 package.json 文件中另一个字段的值(npm)