Wie richte ich ein SSL-Zertifikat für einen express.js-Server ein?

128

Zuvor konnte ich in einer älteren Version von Express Folgendes tun:

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

In neueren Versionen von Express funktioniert dies jedoch nicht mehr:

var app = express();

Soll ich anrufen app.use(), um die Zertifikate einzustellen? Wenn das so ist, wie?

Murvinlai
quelle

Antworten:

151

Siehe die Express-Dokumente sowie die Node-Dokumente für https.createServer (was Express zur Verwendung empfiehlt):

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

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

Weitere Optionen für createServer finden Sie unter: http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener

ebohlman
quelle
Hmmm vom Knoten: https.createServer (Optionen, [requestListener]), also ist das Übergeben der App in Ordnung?
Ist das
1
Was ist die Funktionssignatur für 'App'? Ich versuche, auf Github nach Express zu suchen, aber ich sehe nicht, dass es dauert (req, res)
murvinlai
1
Schauen Sie sich die Definition von createServerin an connect.js(Express erbt dies nur von connect). Sie werden sehen, dass eine Funktion mit der richtigen Signatur zurückgegeben wird. connect()ist einfach ein Alias ​​für connect.createServer()und daher auch express()(was wahrscheinlich eine zusätzliche Initialisierung bewirkt, aber das Ergebnis ist immer noch eine Funktion, die für die Verwendung als Anforderungshandler geeignet ist).
Ebohlman
11
@Qix - im OPs-Beispiel appist definiert. Diese Antwort ist zufriedenstellend.
Seiyria
4
Gibt es einen Überblick darüber, wie man die .pem-Dateien erhält? Ich habe zwei CRT-Dateien von meinem Zertifizierungsanbieter.
SCBuergel.eth
103

Ich konnte SSL mit dem folgenden Boilerplate-Code zum Laufen bringen:

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
quelle
1
Wie sehen Sie die Hallo-Welt im Browser? 127.0.0.1:8000 gibt mir einen Fehler 107 (net :: ERR_SSL_PROTOCOL_ERROR): SSL-Protokollfehler.
aCuria
zu früh gestimmt. Ich bekomme - Fehler: addListener nimmt nur Instanzen von Function
Meekohi
Denken Sie daran, dass dies vor einiger Zeit geschrieben wurde. Es ist möglich, dass dies in neueren Versionen von Express oder Node.js nicht mehr funktioniert
geoffreak
8
Dies ist Jahre zu spät, aber der SSL_PROTOCOL_ERROR kann durch die Tatsache verursacht werden, dass Sie http: // <ssl_enabled_endpoint> verwenden. Es sollte https: // <ssl_enabled_endpoint> sein
andreimarinescu
9

Dies ist mein Arbeitscode für Express 4.0 .

Express 4.0 unterscheidet sich sehr von 3.0 und anderen.

4.0 Sie haben die Datei / bin / www, die Sie hier https hinzufügen werden.

"npm start" ist die Standardmethode zum Starten des Express 4.0-Servers.

Die Funktion readFileSync () sollte __dirname get current directory verwenden

while require () benutze ./ verweise auf das aktuelle Verzeichnis.

Zuerst legen Sie die Dateien private.key und public.cert im Ordner / bin ab. Es ist derselbe Ordner wie in der WWW-Datei .

Kein solches Verzeichnis gefunden Fehler:

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

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

Fehler, kein solches Verzeichnis gefunden

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

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

Arbeitscode sollte sein

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

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

Der vollständige https-Code lautet:

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
quelle