Wie erstellt man bei einem SSL-Schlüssel und einem Zertifikat einen HTTPS-Dienst?
Wie erstellt man bei einem SSL-Schlüssel und einem Zertifikat einen HTTPS-Dienst?
Antworten:
Ich habe folgendes Beispiel gefunden.
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);
setSecure
ist veraltet. Überprüfen Sie dies stattdessen stackoverflow.com/questions/5136353/node-js-https-secure-error
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);
options
zuerst https.createServer
eingeben, um kryptische Fehler zu vermeiden.
openssl genrsa -out key.pem 2048
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);
*.pem
)? Ich habe versucht, dieser Seite zu folgen , aber beim Öffnen localhost:8000
im Browser werden keine Daten empfangen (nur Laden ...).
openssl
, dann in cmd Eingabeaufforderung openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
https://localhost:8080
. HTTP ist NICHT HTTPS.
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});
module.exports
? Das ist nicht nötig
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);
Verwenden Sie Let's Encrypt über Greenlock.js
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 server
Instanz 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).
Damit Ihre App für beide hören http
und https
auf Ports 80
und 443
jeweils, 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
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)