Come si configura un certificato SSL per un server express.js?


128

Prima, in una versione precedente di express, avrei potuto farlo:

express.createServer({key:'keyFile', cert:'certFile'});

Tuttavia, nelle versioni più recenti di express questo non funziona più:

var app = express();

Devo chiamare app.use()per impostare i certificati? Se é cosi, come?

Risposte:


151

Consulta i documenti Express e i documenti Node per https.createServer (che è ciò che Express consiglia di utilizzare):

var privateKey = fs.readFileSync( 'privatekey.pem' );
var certificate = fs.readFileSync( 'certificate.pem' );

https.createServer({
    key: privateKey,
    cert: certificate
}, app).listen(port);

Altre opzioni per createServer sono disponibili su: http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener


Hmmm dal nodo: https.createServer (opzioni, [requestListener]) quindi passare l'app è ok? non è che l'app sia un 'oggetto' ...
murvinlai il

1
qual è la firma della funzione per 'app'? provo a cercare su github per express ma non vedo che ci vuole (req, res)
murvinlai

1
Dai un'occhiata alla definizione di createServerin connect.js(express eredita questo da connect). Vedrai che restituisce una funzione con la firma corretta. connect()è semplicemente un alias per connect.createServer()e quindi lo è express()(che probabilmente esegue un'inizializzazione aggiuntiva, ma il risultato è ancora una funzione appropriata per l'uso come gestore di richieste).
ebohlman,

11
@Qix: nell'esempio dei PO appè definito. Questa risposta è soddisfacente.
Seiyria,

4
c'è qualche schema su come ottenere i file .pem? Ho due file .crt dal mio provider di certificati.
SCBuergel.eth,

103

Sono stato in grado di far funzionare SSL con il seguente codice boilerplate:

var fs = require('fs'),
    http = require('http'),
    https = require('https'),
    express = require('express');

var port = 8000;

var options = {
    key: fs.readFileSync('./ssl/privatekey.pem'),
    cert: fs.readFileSync('./ssl/certificate.pem'),
};

var app = express();

var server = https.createServer(options, app).listen(port, function(){
  console.log("Express server listening on port " + port);
});

app.get('/', function (req, res) {
    res.writeHead(200);
    res.end("hello world\n");
});

1
Come vedi effettivamente il mondo ciao sul browser? 127.0.0.1:8000 mi dà un errore 107 (net :: ERR_SSL_PROTOCOL_ERROR): errore protocollo SSL.
aCuria,

votato troppo presto. Ottengo - Errore: addListener accetta solo istanze di Function
Meekohi

tieni presente che è stato scritto molto tempo fa. È possibile che non
funzioni

8
Questo è troppo tardi, ma SSL_PROTOCOL_ERROR può essere causato dal fatto che stai usando http: // <ssl_enabled_endpoint>. Dovrebbe essere https: // <ssl_enabled_endpoint>
andreimarinescu

9

Questo è il mio codice di lavoro per Express 4.0 .

express 4.0 è molto diverso da 3.0 e altri.

4.0 hai il file / bin / www, che aggiungerai qui https.

"npm start" è il modo standard in cui si avvia il server Express 4.0.

La funzione readFileSync () dovrebbe usare __dirname per ottenere la directory corrente

while require () use ./ consultare la directory corrente.

Per prima cosa metti il ​​file private.key e public.cert nella cartella / bin, è la stessa cartella del file WWW .

nessun errore trovato nella directory:

  key: fs.readFileSync('../private.key'),

  cert: fs.readFileSync('../public.cert')

errore, nessuna directory simile trovata

  key: fs.readFileSync('./private.key'),

  cert: fs.readFileSync('./public.cert')

Il codice di lavoro dovrebbe essere

key: fs.readFileSync(__dirname + '/private.key', 'utf8'),

cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')

Il codice https completo è:

const https = require('https');
const fs = require('fs');

// readFileSync function must use __dirname get current directory
// require use ./ refer to current directory.

const options = {
   key: fs.readFileSync(__dirname + '/private.key', 'utf8'),
  cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')
};


 // Create HTTPs server.

 var server = https.createServer(options, app);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.