只使用socket-io和web客户端(socket io js)进行安全交换

我在debian 8虚拟机上用openssl创build了一个SSL证书。 所以我有一个包含我的密钥和证书的PEM文件。

我想知道是否有可能不使用https,express等使用SSL证书,只需使用带有套接字IO(服务器端)和套接字IO客户端(客户端)的体系结构即可。

服务器端 :

var fs = require("fs") , options = { key : fs.readFileSync('./test/apache.pem'), cert : fs.readFileSync('./test/apache.pem') } var io = require('socket.io').listen(45621, options) io.sockets.on("connection", function(socket) { console.log("socket " + socket.id + " connected !") }) 

客户端:(我正在使用一个简单的HTML客户端)

 <script src="http://code.jquery.com/jquery-latest.min.js"></script> <script src="socket-io-1-2-1.js"></script> <script> var socket = io.connect('https://localhost:45621', {secure: true}) socket.on("connect", function() { alert("we are connected to socket io!") }) </script> 

当我运行我的客户端页面时,我自动收到一个连接closures。 (网:: ERR_CONNECTION_CLOSED)

它工作,如果我删除服务器端的SSL选项,并更改我的客户端连接:

  io.connect("http://localhost:45621") 

但交stream不安全?

编辑:不是重复的,因为我不想使用http,https,由createServer方法表示。 我只使用套接字io。

如果你想让你的客户端连接“ wss:// ”或“ https:// ”,我认为只有使用socket-io服务器来保护你的交换机是不可能的。 我find了一个解决scheme,但为此,即使不使用它们,也需要“ https ”,“ express ”库,并创build如下所示的服务器:

 var https = require('https') , fs = require('fs') //require fs to read your key & cert , app = require("express") , key = fs.readFileSync('<<PATH TO YOUR SSL KEY>>apache.key', 'utf8') , cert = fs.readFileSync('<<PATH TO YOUR SSL CERT>>apache.crt', 'utf8') var server = https.createServer({key: key, cert: cert}, app); //then create your server server.listen(45621) var io = require("socket.io").listen(server); io.sockets.on("connection", function(socket) { console.log("socket id " + socket.id + " connected !") socket.on("foo", function() { console.log("bar") }) }) 

那么你的Web客户端需要是这样的:

 <script src="https://code.jquery.com/jquery-latest.min.js"></script> <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script> <script> var socket = io.connect("https://192.168.0.35:45621/socket.io/?EIO=3&transport=websocket") socket.on("connect", function() { alert("my socket is connected !") }) </script> 

如果要testinglocalhost的SSL证书,请不要在openssl命令的“common name”步骤中写入“localhost”,而要写下本地IP(192.168.0.35)。 然后,与您的客户端,不要连接https:// localhost,但与以下url:

https://您的本地IP:您的服务器端口/ socket.io /?EIO = 3&transport = websocket

在这一刻,我有一个问题,我可以连接我的套接字到我的io服务器,但我不能发射和接收任何发射。 我试过这个解决scheme ,但它不起作用。 我会编辑这个post,当我会发现问题。

编辑 :您需要通过https://运行您的Web客户端,而不是http:// 。 协议http授权您的套接字连接到您的io服务器,但你不能任何东西(发射/接收事件)。