如何使用Express / Socket.io在Node.js上使用HTTPS

我试图用https运行我的节点服务器。 我使用express和socket.io。

这是我的代码https:

var httpsPort = 443; var privateKey = fs.readFileSync(mykeypath'); var certificate = fs.readFileSync(mycertificatepath'); var credentials = {key: privateKey, cert: certificate}; var https = require('https').Server(credentials,app); var io = require('socket.io')(https); https.listen(httpsPort, function(){ logger.info('listening on *:' + httpsPort); }); app.get('/initGame', function (req,res){ var slots = require('./slots.json', 'utf8'); var userObject = { address : req.connection.remoteAddress, userAgent : req.headers['user-agent'] }; db.getPlayedGames(userObject,function(playedGames){ logger.debug(playedGames); if(typeof playedGames == 'undefined' ){ playedGames=0; }else{ playedGames = playedGames.games_played; } var spinsLeft = 10-playedGames; res.json({ spinsLeft: spinsLeft, slots: slots }); }); }); 

在我的客户端它的以下内容:

 var myServer = "//" + document.domain + ":443"; $.get( myServer + "/initGame", function(data) { totalSpinsLeft = data.spinsLeft; $('#trysLeft').text(totalSpinsLeft); Seven.init(data.slots); }).fail(function(){ setTimeout(function(){ $('#spinner2').text('Fehler bitte neu laden!'); },3000); }); 

现在即时在我的服务器上得到以下exception:

uncaughtException:缺lessPFX或证书+私钥。

编辑:现在即时获取

错误的请求

您的浏览器发送了此服务器无法理解的请求。 原因:您正在向使用SSL的服务器端口说纯HTTP。 请使用HTTPSscheme访问此URL。

没有你的密钥和证书文件就很难testing你的例子,而是提供一个使用Express,socket.io和https的例子。

首先,我将创build密钥和证书文件,因此在目录中从terminal运行以下命令:

它下面的命令将生成一个包含RSA密钥的文件。

 $ openssl genrsa 1024 > file.pem 

在这里你会被要求input数据,但你可以留空白按直到crs.pem生成。

 $ openssl req -new -key file.pem -out csr.pem 

然后创build一个包含SSL证书的file.crt文件。

 $ openssl x509 -req -days 365 -in csr.pem -signkey file.pem -out file.crt 

所以在我设置和启动服务器的app.js文件中,我注意到我正在使用上一步生成的文件file.pemfile.crt

 var fs = require('fs'); var https = require('https'); var express = require('express'); var app = express(); var options = { key: fs.readFileSync('./file.pem'), cert: fs.readFileSync('./file.crt') }; var serverPort = 443; var server = https.createServer(options, app); var io = require('socket.io')(server); app.get('/', function(req, res) { res.sendFile(__dirname + '/public/index.html'); }); io.on('connection', function(socket) { console.log('new connection'); socket.emit('message', 'This is a message from the dark side.'); }); server.listen(serverPort, function() { console.log('server up and running at %s port', serverPort); }); 

然后我的public/index.html我消耗服务器:

 <!doctype html> <html> <head> </head> <body> <h1>I am alive!!</h1> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.js"></script> <script> var URL_SERVER = 'https://localhost:443'; var socket = io.connect(URL_SERVER); socket.on('message', function(data) { alert(data); }); </script> </body> </html> 

那么最后如果你从https://localhost的浏览器进行访问,你会看到一个警报,其中包含来自websocket服务器的消息。

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

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

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