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?

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


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

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.