Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js&;Socket.io:用于安全websocket连接的自签名证书_Javascript_Node.js_Security_Sockets_Socket.io - Fatal编程技术网

Javascript Node.js&;Socket.io:用于安全websocket连接的自签名证书

Javascript Node.js&;Socket.io:用于安全websocket连接的自签名证书,javascript,node.js,security,sockets,socket.io,Javascript,Node.js,Security,Sockets,Socket.io,我一直在互联网上寻找一个直截了当的答案,但大多数解决方案都涉及使用Express和提供HTTP内容以实现安全连接。我对Node.js和socket.io的安全web套接字连接(wss)更感兴趣 对于HTTP请求,我不使用Node.js。我使用与Node.js一起工作的socket.io模块将消息实时传递给我的应用程序。我仅将节点用于web套接字连接 我会简要解释我的设置。我使用Django作为我的HTTP后端。用户向Django发出请求,Django将该请求的内容转发给Redis,Node.js

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

对于HTTP请求,我不使用Node.js。我使用与Node.js一起工作的socket.io模块将消息实时传递给我的应用程序。我仅将节点用于web套接字连接

我会简要解释我的设置。我使用Django作为我的HTTP后端。用户向Django发出请求,Django将该请求的内容转发给Redis,Node.js监听Redis的一个频道,处理内容并将消息发送给相应的收件人

非常简单和直接。一切正常。但是,恐怕到Node.js的websocket连接是不安全的。当Node.js向收件人发送消息时,我不希望任何人在其间窥探和截获消息。我希望确保我的用户感到安全,并相信我为他们提供的服务

我研究了自签名证书和来自CA的证书。它们都提供相同级别的安全性。由于我只在socket.io中使用Node.js,而不提供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连接。我做了多少次

谢谢你的帮助

我查看了自签名证书和来自CA的证书。 两者都提供相同级别的安全性


不,他们没有。如果您使用HTTPS(例如SSL内的HTTP)或wss(例如SSL内的HTTP隧道内的套接字),则SSL的安全性与此无关。SSL提供端到端加密,但只有在能够识别另一端的情况下才能保证这种端到端加密。这就是证书的用途。由可信CA签名的证书意味着,某些CA查看证书数据,并确保证书中的数据与所有者匹配。但是一个自签名证书只是说,所有者自己认为一切都很好,但是没有人信任它。这就是自签名证书在默认情况下不受信任的原因,每个用户都必须明确信任该证书(希望在他以某种方式验证了所有者之后)。

首先,我完全同意另一个答案,即自签名证书没有那么安全,但稍后会更加安全。。。您想要做的是要求使用“https”而不是“http”,并创建您的https应用程序。这些选项与其他选项几乎相同。然后,当您调用listenforsocket.io时,您将通过HTTPS而不是HTTP进行侦听


现在回到真正的问题上来,这是对CA用途的误解。我同意即使是自签名证书也会加密内容,但自签名证书不会被任何其他人验证,这意味着任何其他人都可以生成自己的自签名证书,该证书同样有效。咖啡店的恶意用户可以设置看似合法的WiFi网络。在控制该网络时,他可以把自己置身于所有请求的中间。他所要做的就是为你的域名生成他自己的自签名证书,他不仅能够解密,而且能够在传输过程中修改所有请求。这不仅适用于浏览器,也适用于Android、iPhone或其他任何移动应用程序。证书颁发机构已就位,操作系统可以指定哪些根证书受信任以颁发证书。由于恶意用户无法在受信任的证书颁发机构为您的域名注册证书,因此以这种方式验证的任何证书都会保证另一端的计算机实际上是目标计算机。自签名证书在开发中很好,但在生产中使用它们会使通过应用程序发送的任何数据面临欺骗服务器、信息泄露和消息篡改的风险。

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


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

var io = require('socket.io').listen(myHTTPSserver);
这基本上就是它的全部

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

  • 使用签名证书,并让客户机检查该签名。互联网上充斥着解释为什么这实际上是一个相当糟糕的解决方案
  • 确保客户端拒绝连接您的证书以外的任何东西。任何合适的SSL/TLS库都允许您指定必须用于传出连接的证书,如果服务器端的密钥与该证书不匹配,则连接将中止。这做了签名系统应该做的一切,但并不依赖于世界上每一个CA证书的诚实,也不依赖于CA系统的任何其他缺点
您的Django/Node.js组合听起来很奇怪,客户机在一个通道上发出请求,在另一个通道上接收响应,这是否正确理解

虽然从技术上讲这可能没问题,但这听起来像是制造奇怪漏洞的秘方。如果必须同时使用这两个节点,请考虑将节点作为Django内容的代理,并使节点处理所有身份验证。 无论如何,我严重怀疑加密两个通道中的一个是否足够,一旦黑客加密了一个通道,很可能会有过多的升级选项。

这也是我的来源,可能我不清楚,但我的应用程序不适用于web。我做的是严格的移动,更具体