2011-07-06 54 views
123

我试图让我的SSL证书运行socket.io,但它不会连接。node.js,使用SSL的socket.io

我根据我的代码关闭聊天例如:

var https = require('https'); 
var fs = require('fs'); 
/** 
* Bootstrap app. 
*/ 
var sys = require('sys') 
require.paths.unshift(__dirname + '/../../lib/'); 

/** 
* Module dependencies. 
*/ 

var express = require('express') 
    , stylus = require('stylus') 
    , nib = require('nib') 
    , sio = require('socket.io'); 

/** 
* App. 
*/ 
var privateKey = fs.readFileSync('../key').toString(); 
var certificate = fs.readFileSync('../crt').toString(); 
var ca = fs.readFileSync('../intermediate.crt').toString(); 

var app = express.createServer({key:privateKey,cert:certificate,ca:ca }); 


/** 
* App configuration. 
*/ 

... 

/** 
* App routes. 
*/ 

app.get('/', function (req, res) { 
    res.render('index', { layout: false }); 
}); 

/** 
* App listen. 
*/ 

app.listen(443, function() { 
    var addr = app.address(); 
    console.log(' app listening on http://' + addr.address + ':' + addr.port); 
}); 

/** 
* Socket.IO server (single process only) 
*/ 

var io = sio.listen(app,{key:privateKey,cert:certificate,ca:ca}); 
... 

如果我删除了SSL代码运行良好,但与它我得到http://domain.com/socket.io/1/?t=1309967919512

注意一个请求时,它并不想HTTPS,这导致它失败。

我正在测试铬,因为它是此应用程序的目标浏览器。

我很抱歉,如果这是一个简单的问题,我是一个节点/ socket.io新手。

谢谢!

+0

您的客户端是否尝试连接到'wss://'前缀URI。 – kanaka

+0

不让它到达那里,它使请求http://domain.com/socket.io/1/?t=1309967919512然后死亡。 – Beyond

+0

你如何指定要连接的地址? “domain.com”听起来像是socket.io客户端库中的占位符。你可以发布你用来连接的客户端Javascript代码吗? – kanaka

回答

150

为您的初始连接使用安全的URL,即使用“https://”而不是“http://”。如果选择了WebSocket传输,那么Socket.IO应该也自动使用“wss://”(SSL)进行WebSocket连接。

更新

您也可以尝试创建使用“安全”选项连接:

var socket = io.connect('https://localhost', {secure: true}); 
+0

我们这样做。我们转到https://www.thebitcoinwheel.com,它仍然会自动向http发送请求,这是socket.io代码的问题,也是问题的关键。 – Beyond

+8

安全:真的做到了,谢谢kanaka! – Beyond

+1

你们救了我的命!我无法在文档中找到这些选项。 –

25

在相同的音符,如果你的服务器支持httphttps您可以使用连接:

var socket = io.connect('//localhost'); 

to auto detect the browser scheme and connect using htt相应的p/https。当在HTTPS,传输将被默认地固定,如使用

var socket = io.connect('https://localhost'); 

将使用安全Web套接字连接 - wss://(该{secure: true}是冗余的)。

有关如何使用同一节点服务器轻松地同时服务http和https的更多信息,请查看this answer

23

这是我设法用快递将其设置:

var fs = require('fs'); 
var app = require('express')(); 
var https  = require('https'); 
var server = https.createServer({ 
    key: fs.readFileSync('./test_key.key'), 
    cert: fs.readFileSync('./test_cert.crt'), 
    ca: fs.readFileSync('./test_ca.crt'), 
    requestCert: false, 
    rejectUnauthorized: false 
},app); 
server.listen(8080); 

var io = require('socket.io').listen(server); 

io.sockets.on('connection',function (socket) { 
    ... 
}); 

app.get("/", function(request, response){ 
    ... 
}) 


我希望这将节省别人的时间。

更新:使用那些让加密使用本

var server = https.createServer({ 
       key: fs.readFileSync('privkey.pem'), 
       cert: fs.readFileSync('fullchain.pem') 
      },app); 
+1

这是为我工作的唯一解决方案。谢谢你节省我的时间。 –

+0

对我有好处后,与证书 – RozzA

+0

一点点的试验和错误这是一个很好的解决方案 –

4

如果您的服务器认证文件不被信任,(例如,您可以用Java中的Keytool命令生成自己的密钥库) ,你应该添加额外的选项rejectUnauthorized

var socket = io.connect('https://localhost', {rejectUnauthorized: false}); 
4

检查this.configuration ..

app = module.exports = express(); 
var httpsOptions = { key: fs.readFileSync('certificates/server.key'), cert: fs.readFileSync('certificates/final.crt') };   
var secureServer = require('https').createServer(httpsOptions, app); 
io = module.exports = require('socket.io').listen(secureServer,{pingTimeout: 7000, pingInterval: 10000}); 
io.set("transports", ["xhr-polling","websocket","polling", "htmlfile"]); 
secureServer.listen(3000);