我在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。
答案 0 :(得分:5)
如果您希望客户端与“ wss:// ”或“ https:/”进行连接,我认为不可能仅使用socket-io服务器来保护您的交易所/ 强>”。我找到了一个解决方案,但为此你需要“ https ”,“ express ”库,即使你不使用它们并像这样创建你的服务器: / p>
然后你的网络客户端必须是这样的: 如果要为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服务器但是您不能做任何事情(发出/接收事件)。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>