https - 帶有SSL的node.js,socket.io




websocket (5)

同樣的說明,如果你的服務器同時支持httphttps你可以使用:

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

自動檢測瀏覽器方案並相應地使用http / https進行連接。 當在https中時,運輸將被默認保護,如連接使用

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

將使用安全的Web套接字wss://{secure: true}是多餘的)。

有關如何使用同一個節點服務器輕鬆地為http和https服務的更多信息,請查看此答案

我試圖讓我的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,導致它失敗。

我正在測試Chrome,因為它是此應用程序的目標瀏覽器。

我很抱歉,如果這是一個簡單的問題,我是一個節點/ socket.io新手。

謝謝!


為您的初始連接使用安全的URL,即使用“https://”而不是“https://”。 如果選擇了WebSocket傳輸,那麼Socket.IO應該也自動使用“wss://”(SSL)進行WebSocket連接。

更新

您也可以嘗試使用“安全”選項創建連接:

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

這就是我設法用快速設置的方式:

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

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

文件系統API中有很多細節。 最常見的方式(據我所知)是:

var fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
    if(err) {
        return console.log(err);
    }

    console.log("The file was saved!");
}); 




ssl node.js https websocket socket.io