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

时间:2016-02-22 23:09:06

标签: node.js ssl socket.io pem

我在debian 8 VM上使用openssl创建了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>

当我运行客户端页面时,我会自动收到关闭连接。 (净:: ERR_CONNECTION_CLOSED)

如果我删除服务器端的SSL选项并使用以下命令更改我的客户端连接,则可以使用

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

但是交换不安全吗?

编辑:不是this的副本,因为我不想使用http,https,通过createServer方法表达。我只使用socket io。

1 个答案:

答案 0 :(得分:5)

如果您希望客户端与“ wss:// ”或“ https:/”进行连接,我认为不可能仅使用socket-io服务器来保护您的交易所/ ”。我找到了一个解决方案,但为此你需要“ https ”,“ express ”库,即使你不使用它们并像这样创建你的服务器: / p>

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") })
})

然后你的网络客户端必须是这样的:

<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>

如果要为localhost测试SSL证书,请不要在openssl命令的“common name”步骤中写入“localhost”,而是写下本地IP(对我来说是192.168.0.35)。然后与您的客户联系,请不要与https://localhost联系,但请使用以下网址:

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

此时,我遇到了问题,我可以将我的插座连接到我的io服务器,但我无法发出并接收任何发射。我试过了this solution,但它不起作用。我会在发现问题时编辑这篇文章。

修改:您需要通过 https:// ,而不是 http:// 来运行您的网络客户端。协议http授权您的套接字连接到您的io服务器但是您不能做任何事情(发出/接收事件)。