Node.js和Socket.io:安全websocket连接的自签名证书

noa*_*ale 7 javascript sockets security node.js socket.io

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

我没有将Node.js用于HTTP请求.我使用与Node.js一起使用的socket.io模块将消息实时传递给我的应用程序.我只使用节点进行Web套接字连接.

我会简单解释一下我的设置是什么.我使用Django作为我的HTTP后端.用户向Django发出请求,Django将该请求的内容转发给Redis,Node.js在Redis的一个频道上侦听,它处理内容并将消息发送给适当的收件人.

非常简单直接.一切正常.但我担心与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');
     }
Run Code Online (Sandbox Code Playgroud)

到目前为止,我刚刚编写了一个简单的连接函数.它可以作为普通的websocket连接.但我想使它成为一个安全的websocket连接.我有多少这样做?

谢谢您的帮助.

aaa*_*aaa 7

首先,您需要在节点中创建HTTPS服务器(您需要证书):

http://nodejs.org/api/https.html
如何在Node.js中创建HTTPS服务器?

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

var io = require('socket.io').listen(myHTTPSserver);
Run Code Online (Sandbox Code Playgroud)

基本上应该是它的全部内容.

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

  • 使用签名证书,让客户端检查该签名.互联网上充斥着解释为什么这实际上是一个非常糟糕的解决方案.
  • 确保客户端拒绝连接除证书之外的任何内容.任何正常的SSL/TLS库都允许您指定必须用于传出连接的证书,如果服务器端的密钥与该证书不匹配,则连接将被中止.这可以完成签名系统应该执行的所有操作,但不依赖于世界上每个单独的CA证书,或者CA系统的任何其他缺点.

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

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

在任何情况下,我都非常怀疑只加密两个频道中的一个就足够了,一旦黑客已经关注了一个频道,很可能会出现过多的升级选项.