web-dev-qa-db-de.com

Wie erstelle ich einen HTTPS-Server in Node.js?

Wie wird ein HTTPS-Dienst erstellt, wenn ein SSL-Schlüssel und ein Zertifikat vorliegen?

333
murvinlai

Ich habe folgendes Beispiel gefunden.

https://web.archive.org/web/20120203022122/http://www.silassewell.com/blog/2010/06/03/node-js-https-ssl-server-example/ =

Dies funktioniert für Knoten v0.1.94 - v0.3.1. server.setSecure() wurde in neueren Versionen von node entfernt.

Direkt aus dieser Quelle:

const crypto = require('crypto'),
  fs = require("fs"),
  http = require("http");

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

var credentials = crypto.createCredentials({key: privateKey, cert: certificate});

var handler = function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
};

var server = http.createServer();
server.setSecure(credentials);
server.addListener("request", handler);
server.listen(8000);
145
hvgotcodes

Das Express API-Dokument macht dies ziemlich deutlich.

Zusätzlich enthält diese Antwort die Schritte zum Erstellen eines selbstsignierten Zertifikats.

Ich habe einige Kommentare und einen Ausschnitt aus der Node.js HTTPS-Dokumentation hinzugefügt :

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

// This line is from the Node.js HTTPS documentation.
var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert')
};

// Create a service (the app object is just a callback).
var app = express();

// Create an HTTP service.
http.createServer(app).listen(80);
// Create an HTTPS service identical to the HTTP service.
https.createServer(options, app).listen(443);
456
Jacob Marble

Ich habe diese Frage beim googeln von "node https" gefunden, aber das Beispiel in akzeptierte Antwort ist sehr alt - aus docs der aktuellen (v0.10) Version von node, es sollte so aussehen:

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

var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);
83
pkyeck

Die obigen Antworten sind gut, aber mit Express und Node wird dies gut funktionieren.

Da Express die App für Sie erstellt, überspringe ich das hier.

var express = require('express')
  , fs = require('fs')
  , routes = require('./routes');

var privateKey = fs.readFileSync('cert/key.pem').toString();
var certificate = fs.readFileSync('cert/certificate.pem').toString();  

// To enable HTTPS
var app = module.exports = express.createServer({key: privateKey, cert: certificate});
48
nu1silva

Das minimale Setup für einen HTTPS-Server in Node.js würde ungefähr so ​​aussehen:

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);

Wenn Sie auch http-Anfragen unterstützen möchten, müssen Sie nur diese kleine Änderung vornehmen:

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
18
John Slegers

Aktualisieren

Verwenden Sie Let's Encrypt über Greenlock.js

Ursprünglicher Beitrag

Mir ist aufgefallen, dass keine dieser Antworten zeigt, dass das Hinzufügen einer Zwischen-Stammzertifizierungsstelle zu der Kette einige Null- Konfigurationsbeispiele zum Spielen, um zu sehen, dass:

Snippet:

var options = {
  // this is the private key only
  key: fs.readFileSync(path.join('certs', 'my-server.key.pem'))

// this must be the fullchain (cert + intermediates)
, cert: fs.readFileSync(path.join('certs', 'my-server.crt.pem'))

// this stuff is generally only for peer certificates
//, ca: [ fs.readFileSync(path.join('certs', 'my-root-ca.crt.pem'))]
//, requestCert: false
};

var server = https.createServer(options);
var app = require('./my-express-or-connect-app').create(server);
server.on('request', app);
server.listen(443, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

var insecureServer = http.createServer();
server.listen(80, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

Dies ist eines der Dinge, die oft einfacher sind, wenn Sie nicht direkt über connect oder express versuchen , sondern das native https Modul handhaben und dann verwenden, um Sie Connect/Express-App zu dienen.

Wenn Sie server.on('request', app) verwenden, anstatt die App beim Erstellen des Servers zu übergeben, haben Sie die Möglichkeit, die server -Instanz an eine Initialisierungsfunktion zu übergeben, mit der die Connect/Express-App erstellt wird (sofern Sie dies möchten) Führen Sie beispielsweise Websockets über ssl auf demselben Server aus.

18
CoolAJ86

Führen Sie die folgenden Schritte aus, damit Ihre App an den Ports 80 und 443 auf http und https wartet

Erstellen Sie eine Express-App:

var express = require('express');
var app = express();

Die von express() zurückgegebene App ist eine JavaScript-Funktion. Es kann als Rückruf an die HTTP-Server von Node übergeben werden, um Anforderungen zu verarbeiten. Auf diese Weise können Sie problemlos HTTP- und HTTPS-Versionen Ihrer App mit derselben Codebasis bereitstellen.

Sie können dies wie folgt tun:

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

var options = {
  key: fs.readFileSync('/path/to/key.pem'),
  cert: fs.readFileSync('/path/to/cert.pem')
};

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

Ausführliche Informationen finden Sie in doc

8
cmd