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

360

Wie erstellt man bei einem SSL-Schlüssel und einem Zertifikat einen HTTPS-Dienst?

Murvinlai
quelle
2
Ich habe restify.js anstelle von express.js verwendet, aber die Idee ist dieselbe. Hier ist, wie ich einen node.js-Server einrichte, der sowohl HTTP als auch HTTPS akzeptiert. Qugstart.com/blog/node-js/…
warte auf den
2
ohne Express und mit der neuesten Version von Node - siehe hier: stackoverflow.com/a/21809393/388026
pkyeck
1
Was ist mit dieser Frage passiert? Die Antworten implizieren, dass es ursprünglich um express.js ging.
Doug65536
Es ist trivial, ein gültiges, selbstsigniertes SSL-Zertifikat zu erstellen und einen HTTPS-Server zu starten, nur ein paar Schritte
Lloyd
3
Es ist etwas spät, aber wenn jemand ein vollständiges https-Tutorial für nodejs benötigt, finden Sie es hier: programmerblog.net/nodejs-https-server
Jason W

Antworten:

150

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 den Knoten v0.1.94 - v0.3.1. server.setSecure()wird 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);
hvgotcodes
quelle
3
setSecureist veraltet. Überprüfen Sie dies stattdessen stackoverflow.com/questions/5136353/node-js-https-secure-error
Larry Battle
7
Siehe die offizielle Express-Antwort unten von @Jacob Marble.
Clayzermk1
21
Dieses Beispiel funktioniert nicht mehr, da die HTTPS-Implementierung in Node.JS 0.4 erneut durchgeführt wurde. Siehe die entsprechenden Dokumente unter nodejs.org. stackoverflow.com/questions/5136353/…
Scottyab
11
Diese Antwort ist sehr alt und funktioniert nicht mehr. Bitte sehen Sie die Antwort von pkyeck unten, oder gehen Sie zu: nodejs.org/api/https.html
Jay Sheth
2
Auch die Verbindung ist unterbrochen
TlonXP
484

Das Express API-Dokument beschreibt 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 HTTPS-Dokumentation von Node.js 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);
Jacob Marmor
quelle
49
Schön, wollte das gerade selbst posten. Vielen Dank. Außerdem fand ich diesen Artikel hilfreich, um ein selbstsigniertes Zertifikat zu erstellen.
Clayzermk1
1
Stellen Sie sicher, dass Sie optionszuerst https.createServereingeben, um kryptische Fehler zu vermeiden.
Wberry
1
Ich richte einen fast identischen https-Server-Port 8888 ein und bin mir nicht sicher, wie ich die Routen ändern soll. Wenn ich curl curl ausführe - unsicherer localhost: 8888 curl: (35) Unbekannter SSL-Protokollfehler in Verbindung mit localhost: 8888, woher kommt der Fehler und wie kann man ihn umgehen? Wenn ich localhost: 8888 in den Browser eingebe, hängt es und https: / localhost: 8888 gibt SSL-Fehler
reza
2
@ Costa können Sie Benutzer von http nach https mit Express-Force-SSL oder handgeschriebener Middleware umleiten - es ist ziemlich einfach
Floatdrop
1
@ NathanMcKaskle Sie können das Passwort deaktivieren: Überprüfen Sie diese Anleitung, aber wenn Sie macOS verwenden, stellen Sie sicher, dass die generierte Schlüssellänge mindestens 2048 ist:openssl genrsa -out key.pem 2048
Sakisk
87

Diese Frage wurde beim Googeln von "node https" gefunden, aber das Beispiel in der akzeptierten Antwort ist sehr alt - aus den Dokumenten der aktuellen (v0.10) Version von node sollte es folgendermaßen 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);
pkyeck
quelle
Lief wie am Schnürchen. Diese Informationen waren sehr nützlich, als ich ein node.js-Tool (PDFJS) auf einer PHP-App ausführte, die kürzlich gezwungen war, über https zu laufen. Der iframe war sehr unglücklich, meine node.js-App auf einen alternativen Nicht-https-Port zu laden.
lewsid
2
Das sieht gut aus, aber wie kann ich die Dateien generieren, die Sie dort benötigen ( *.pem)? Ich habe versucht, dieser Seite zu folgen , aber beim Öffnen localhost:8000im Browser werden keine Daten empfangen (nur Laden ...).
Ionică Bizău
7
@ IonicăBizău, um Schlüssel zu generieren, installieren openssl, dann in cmd Eingabeaufforderung openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
eingeben
2
@ IonicăBizău müssen Sie direkt zu gehen https://localhost:8080. HTTP ist NICHT HTTPS.
Florian Wendelborn
Ist es möglich, einen https-Server mit Ordner zu erstellen? Sie können also eine Datei einfügen
FrenkyB
47

Die obigen Antworten sind gut, aber mit Express und Node funktioniert dies einwandfrei.

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});
nu1silva
quelle
Dies ist technisch die korrektere Antwort, da die Frage war, wie man es mit Express.js macht
Kato
12
Dies scheint veraltet zu sein, da "Anwendungen nicht mehr von http.Server erben"
Merlyn Morgan-Graham
2
Warum stellst du ein module.exports? Das ist nicht nötig
Matej
1
@matejkramny, wahrscheinlich weil es einfach zu testen ist.
Justin
21

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

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);
John Slegers
quelle
18

Aktualisieren

Verwenden Sie Let's Encrypt über Greenlock.js

Ursprünglicher Beitrag

Ich habe festgestellt, dass keine dieser Antworten das Hinzufügen einer Zwischenstammzertifizierungsstelle zur Kette zeigt. Hier sind einige Beispiele für die Nullkonfiguration, mit denen Sie spielen können, um Folgendes zu sehen:

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 versuchen, es direkt über Connect oder Express zu tun, sondern den Eingeborenen lassenhttps Modul damit umgehen lassen und es dann verwenden, um Ihre Connect / Express-App zu bedienen.

Wenn Sie server.on('request', app)die App beim Erstellen des Servers verwenden, anstatt sie zu übergeben, haben Sie die Möglichkeit, die serverInstanz an eine Initialisierungsfunktion zu übergeben, mit der die Connect / Express-App erstellt wird (falls Sie dies möchten) WebSockets über ssl auf dem gleichen Server, für Beispiel).

CoolAJ86
quelle
Dies ist eine nette Erklärung, aber der bereitgestellte Link im Update-Bereich ist defekt (gibt 500 Fehler)
Chucky
8

Damit Ihre App für beide hören httpund httpsauf Ports 80und 443jeweils, folgendermaßen

Erstellen Sie eine Express-App:

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

Die von zurückgegebene App express()ist eine JavaScript-Funktion. Es kann als Rückruf zur Bearbeitung von Anforderungen an die HTTP-Server von Node übergeben werden. Dies macht es einfach, sowohl HTTP- als auch HTTPS-Versionen Ihrer App mit derselben Codebasis bereitzustellen.

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 im Dokument

cmd
quelle
0

Sie können dies auch mit dem Fastify-Framework archivieren:

const { readFileSync } = require('fs')
const Fastify = require('fastify')

const fastify = Fastify({
  https: {
    key: readFileSync('./test/asset/server.key'),
    cert: readFileSync('./test/asset/server.cert')
  },
  logger: { level: 'debug' }
})

fastify.listen(8080)

(und ausführen openssl req -nodes -new -x509 -keyout server.key -out server.cert, um die Dateien zu erstellen, wenn Sie Tests schreiben müssen)

Manuel Spigolon
quelle
-4
  1. Laden Sie die rar-Datei für openssl herunter, die hier eingerichtet wurde: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. Kopieren Sie einfach Ihren Ordner in Laufwerk c.
  3. Erstellen Sie die Datei openssl.cnf und laden Sie deren Inhalt herunter von: http://web.mit.edu/crypto/openssl.cnf openssl.cnf kann an einer beliebigen Stelle abgelegt werden, aber der Pfad sollte korrekt sein, wenn wir die Eingabeaufforderung eingeben.
  4. Öffnen Sie den Befehl propmt und setzen Sie den Pfad openssl.cnf C: \ set OPENSSL_CONF = d: /openssl.cnf. 5. Führen Sie dies in cmd aus: C: \ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. Führen Sie dann OpenSSL> genrsa -des3 -out server.enc.key 1024 aus
  6. Dann werden Sie nach Passphrasen gefragt: Geben Sie 4 bis 11 Zeichen als Passwort für das Zertifikat ein
  7. Führen Sie dann diese Option aus. Öffnen> req -new -key server.enc.key -out server.csr
  8. Dann werden Sie nach einigen Details wie dem Ländercode, dem Namen des Bundesstaates usw. gefragt. Füllen Sie diese frei aus. 10. Führen Sie dann Openssl> rsa -in server.enc.key -out server.key aus
  9. Führen Sie diese OpenSSL> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt aus und verwenden Sie dann den vorherigen Code, der sich im Stapelüberlauf befindet. Danke
Er Shubham Patidar
quelle
1
das ist OT . Die Frage des OP ist klar. Zertifikate sind bereits gegeben.
Martin Schneider