2015-07-01 12 views
18

Sto cercando di eseguire il mio server nodo con https. Sto usando express e socket.io.Come utilizzare HTTPS su Node.js utilizzando Express/Socket.io

Questo è il mio codice per 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 
    }); 
    }); 
}); 

sul mio cliente proprio il seguente:

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

}); 

Proprio ora im ricevendo il seguente eccezione sul mio server:

uncaughtException: Mancare PFX o certificato + chiave privata.

EDIT: adesso Im ottenendo

Bad Request

Il tuo browser ha inviato una richiesta che questo server non riusciva a capire. Motivo: si sta parlando semplicemente di HTTP a una porta del server abilitata per SSL. Usa invece lo schema HTTPS per accedere a questo URL, per favore.

risposta

53

È difficile testare il tuo esempio senza i tuoi file di chiave e cert, ma fornirò un esempio in cui sto usando Express, socket.io e https.

Per prima cosa creerà i file chiave e CERT, quindi all'interno di una directory eseguire i seguenti comandi dal terminale:

Il comando di seguito che sta per generare un file contenente una chiave RSA.

$ openssl genrsa 1024 > file.pem 

Qui vi verrà chiesto di inserire i dati, ma si può lasciare in bianco pressatura immettere fino a quando viene generato il crs.pem.

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

Quindi verrà creato un file file.crt contenente un certificato SSL.

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

Così nel mio file app.js dove sto Impostazione ed inizio l'avviso server che sto usando i file file.pem e file.crt generato nell'ultimo passaggio:

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

e poi il mio public/index.html dove sto consumando il server:

<!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> 

infine, se si accede dal browser allo https://localhost, verrà visualizzato un avviso con un messaggio proveniente dal server Websocket.

+0

Grazie ha funzionato :) – kovogel

+0

@kovogel siete i benvenuti! – Wilson

+0

ha funzionato anche per me, grazie mille. mi accorgo che hai cambiato (punto) Server in (punto) createServer - qualsiasi motivo per questo? Ho cambiato anche il mio e ha funzionato. – edwardsmarkf

2

Questo è come sono riuscito a configurarlo con espresso:

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

spero che questo farà risparmiare tempo di qualcuno.

+0

Ciao emonik, come si ottengono i file test_key.key, test_cert.crt e test_cs.crt? –

+0

Io uso consente di crittografare come ssl. –

+0

@ClaesGustavsson: utilizzare questo per permette cifrare 'server di var = https.createServer ({ chiave: fs.readFileSync ('privkey.pem'), cert: fs.readFileSync ('fullchain.pem') }, app); ' – emonik

Problemi correlati