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

Secure exchanges using only socket-io and web client (socket io js)

我在 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、express by createServer 方法。我只使用套接字 io.

我认为如果您希望您的客户端连接到“wss://”或“https://”。我找到了一个解决方案,但为此你需要“https”、“express”库,即使你不使用它们并创建你的服务器是这样的:

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>

如果您想为本地主机测试 SSL 证书,请不要在步骤 "common name" 中使用 openssl 命令写入 "localhost",而是写入您的本地 IP(对我来说是 192.168.0.35)。然后与您的客户一起,不要连接 https://localhost 而是连接以下 url :

https://YOUR 本地 IP:YOUR 服务器 PORT/socket.io/?EIO=3&transport=websocket

此刻,我遇到了一个问题,我可以将我的套接字连接到我的 io 服务器,但我无法发射和接收任何发射。我尝试了 this solution,但它不起作用。当我发现问题时,我会编辑这个 post。

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