node.js,带有SSL的socket.io

我试图让我的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,导致它失败。

我正在testing铬,因为它是这个应用程序的目标浏览器。

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

谢谢!

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

更新

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

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

同样的说明,如果你的服务器同时支持httphttps你可以使用:

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

自动检测浏览器scheme并相应地使用http / https进行连接。 当在https中,运输将被默认保护,如连接使用

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

将使用安全的networking套接字 – wss://{secure: true}是多余的)。

有关如何使用同一节点服务器轻松服务http和https的更多信息,请查看此答案 。

这就是我设法用快速设置的方式:

 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){ ... }) 

我希望这会节省一些时间。

更新:对于那些使用encryption使用这个

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

如果您的服务器authentication文件不可信(例如,您可能自己使用java中的keytool命令生成密钥库),则应该添加额外选项rejectUnauthorized

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

检查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);