Biorąc pod uwagę klucz SSL i certyfikat, w jaki sposób można utworzyć usługę HTTPS?
Biorąc pod uwagę klucz SSL i certyfikat, w jaki sposób można utworzyć usługę HTTPS?
Odpowiedzi:
Znalazłem następujący przykład.
Działa to dla węzła v0.1.94 - v0.3.1. server.setSecure()jest usuwany w nowszych wersjach węzła.
Bezpośrednio z tego źródła:
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);
setSecurejest przestarzałe. Sprawdź to zamiast tego stackoverflow.com/questions/5136353/node-js-https-secure-error
Dokument Express API określa to dość wyraźnie.
Dodatkowo ta odpowiedź zawiera instrukcje tworzenia certyfikatu z podpisem własnym.
Dodałem kilka komentarzy i fragmentu z dokumentacji HTTPS Node.js :
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);
optionspierwszym miejscu https.createServer, aby uniknąć tajemniczych błędów.
openssl genrsa -out key.pem 2048
Znalazłem to pytanie podczas przeglądania „węzła https”, ale przykład w zaakceptowanej odpowiedzi jest bardzo stary - wzięty z dokumentacji aktualnej wersji (v0.10) węzła, powinien wyglądać następująco:
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)? Próbowałem śledzić tę stronę , ale podczas otwierania localhost:8000w przeglądarce nie otrzymano żadnych danych (tylko ładowanie ...).
openssl, a następnie w wierszu polecenia cmd wpiszopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
https://localhost:8080. HTTP NIE JEST HTTPS.
Powyższe odpowiedzi są dobre, ale w przypadku Express i node to będzie działać poprawnie.
Ponieważ ekspresowe tworzenie aplikacji dla Ciebie, pomiń to tutaj.
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? Nie ma takiej potrzeby
Minimalna konfiguracja serwera HTTPS w Node.js wyglądałaby mniej więcej tak:
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);
Jeśli chcesz również obsługiwać żądania HTTP, musisz wprowadzić tylko małą modyfikację:
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);
Użyj Let's Encrypt poprzez Greenlock.js
Zauważyłem, że żadna z tych odpowiedzi nie pokazuje, że dodanie pośredniego głównego urzędu certyfikacji do łańcucha, oto kilka przykładów konfiguracji zerowej, z którymi można się bawić, aby zobaczyć, że:
Skrawek:
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);
});
Jest to jedna z tych rzeczy, które często są łatwiejsze, jeśli nie próbujesz zrobić tego bezpośrednio przez connect lub express, ale pozwól natywnemu httpsmodułowi to obsłużyć, a następnie użyj tego do obsługi aplikacji connect / express.
Ponadto, jeśli używasz server.on('request', app)zamiast przekazywania aplikacji podczas tworzenia serwera, daje to możliwość przekazania serverinstancji do jakiejś funkcji inicjalizującej, która tworzy aplikację Connect / Express (jeśli chcesz zrobić WebSockets przez SSL na tym samym serwerze, dla przykład).
Aby aplikacja mogła nasłuchiwać zarówno na portach, jak httpi httpsna portach, 80i 443odpowiednio wykonaj następujące czynności
Utwórz aplikację ekspresową:
var express = require('express');
var app = express();
Aplikacja zwracana przez express()to funkcja JavaScript. Może być przekazany do serwerów HTTP Node jako callback do obsługi żądań. Ułatwia to dostarczanie wersji aplikacji HTTP i HTTPS przy użyciu tej samej bazy kodu.
Możesz to zrobić w następujący sposób:
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);
Aby uzyskać szczegółowe informacje, zobacz dokument
Możesz użyć również zarchiwizować to w ramach Fastify:
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)
(i uruchom, openssl req -nodes -new -x509 -keyout server.key -out server.certaby utworzyć pliki, jeśli chcesz napisać testy)
var path = require('path');
var express = require('express');
var app = express();
var staticPath = path.join(__dirname, '/public');
app.use(express.static(staticPath));
app.listen(8070, function() {
console.log('Server started at port 8070');
});