Jak skonfigurować certyfikat SSL dla serwera express.js?

128

Wcześniej w starszej wersji express mogłem to zrobić:

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

Jednak w nowszych wersjach express to już nie działa:

var app = express();

Czy powinienem zadzwonić, app.use()aby ustawić certyfikaty? Jeśli tak to jak?

murvinlai
źródło

Odpowiedzi:

151

Zobacz dokumentację Express, a także dokumentację Node dla https.createServer (która jest tym, co express zaleca użycie):

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

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

Inne opcje createServer są dostępne pod adresem : http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener

ebohlman
źródło
Hmmm z węzła: https.createServer (opcje, [requestListener]), więc przekazywanie aplikacji jest w porządku? czy ta aplikacja nie jest „obiektem” ...
murvinlai
1
jaki jest podpis funkcji dla „aplikacji”? próbuję poszukać na githubie ekspresu, ale nie widzę, że to zajmuje (req, res)
murvinlai
1
Spójrz na definicję createServerin connect.js(express po prostu dziedziczy to z connect). Zobaczysz, że zwraca funkcję z poprawnym podpisem. connect()jest po prostu aliasem dla connect.createServer()i tak jest express()(co prawdopodobnie wymaga dodatkowej inicjalizacji, ale wynikiem jest nadal funkcja odpowiednia do użycia jako procedura obsługi żądań).
ebohlman
11
@Qix - w przykładzie PO appjest zdefiniowane. Ta odpowiedź jest zadowalająca.
Seiyria
4
czy istnieje zarys, jak uzyskać pliki .pem? Mam dwa pliki .crt od mojego dostawcy certyfikatów.
SCBuergel.eth
103

Udało mi się uzyskać SSL działający z następującym standardowym kodem:

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");
});
geoffreak
źródło
1
Jak właściwie widzisz hello world w przeglądarce? 127.0.0.1:8000 daje mi błąd 107 (net :: ERR_SSL_PROTOCOL_ERROR): błąd protokołu SSL.
aCuria
zbyt wcześnie przegłosowano. Otrzymuję - Błąd: addListener pobiera tylko wystąpienia funkcji
Meekohi
pamiętaj, że zostało napisane dość dawno temu. Możliwe, że to już nie działa w nowszych wersjach Express lub Node.js
geoffreak
8
Jest o wiele lat za późno, ale błąd SSL_PROTOCOL_ERROR może być spowodowany faktem, że używasz http: // <ssl_enabled_endpoint>. Powinien być https: // <ssl_enabled_endpoint>
andreimarinescu
9

To jest mój działający kod dla Express 4.0 .

express 4.0 bardzo różni się od 3.0 i innych.

4.0 masz plik / bin / www, który zamierzasz dodać tutaj https.

„npm start” to standardowy sposób uruchamiania serwera Express 4.0.

Funkcja readFileSync () powinna używać __dirname, aby uzyskać bieżący katalog

while require () use ./ odwołuje się do bieżącego katalogu.

Najpierw umieść plik private.key i public.cert w folderze / bin, jest to ten sam folder, co plik WWW .

nie znaleziono takiego katalogu błąd:

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

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

błąd, nie znaleziono takiego katalogu

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

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

Kod roboczy powinien być

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

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

Kompletny kod https to:

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);
hoogw
źródło