我试图用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); });
现在我在服务器上收到以下异常:
uncaughtException:缺少PFX或证书+私钥。
编辑:现在我越来越
错误的请求
您的浏览器发送了该服务器无法理解的请求。原因:您正在对启用SSL的服务器端口使用纯HTTP。请改用HTTPS方案访问此URL。
没有密钥和证书文件就很难测试您的示例,相反,我将提供一个使用Express,socket.io和https的示例。
首先,我将创建密钥和证书文件,因此在目录中,从终端运行以下命令:
它下面的命令将生成一个包含RSA密钥的文件。
$ openssl genrsa 1024 > file.pem
在这里,将要求您输入数据,但是可以按Enter保留空白,直到生成crs.pem。
$ openssl req -new -key file.pem -out csr.pem
然后将创建一个包含SSL证书的file.crt文件。
$ openssl x509 -req -days 365 -in csr.pem -signkey file.pem -out file.crt
因此,app.js在我要设置和启动服务器的文件中file.pem,请注意我正在使用文件并file.crt在最后一步中生成:
app.js
file.pem
file.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使用服务器的位置:
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服务器的消息。
https://localhost