javascript - Hogyan lehet HTTPS szervert létrehozni Node.js-ben?
Adott egy SSL kulcs és tanúsítvány, hogyan hoz létre valaki HTTPS szolgáltatást?
Válasz #1
Az Express API dokumentáció ezt elég egyértelműen kifejti.
Ezenkívül ez a válasz lépésről lépésre bemutatja, hogyan lehet önaláírt tanúsítványt létrehozni.
Hozzáadtam néhány megjegyzést és egy részletet a Node.js HTTPS dokumentációból:
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);
Válasz #2
A Node 0.3.4-től kezdve egészen a jelenlegi LTS-ig (a szerkesztés idején v21), a https://nodejs.org/api/https.html#httpscreateserveroptions-requestlistener tartalmazza az összes szükséges példakódot:
const https = require('node:https');
const fs = require('node:fs');
const options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'),
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
Vegye figyelembe, hogy ha a certbot eszközt szeretné használni a Let's Encrypt tanúsítványainak beszerzésére, a titkos kulcs neve privkey.pem, a tanúsítvány pedig fullchain.pem:
const certDir = `/etc/letsencrypt/live`;
const domain = `YourDomainName`;
const options = {
key: fs.readFileSync(`${certDir}/${domain}/privkey.pem`),
cert: fs.readFileSync(`${certDir}/${domain}/fullchain.pem`)
};
Válasz #3
Rátaláltam erre a kérdésre, miközben a "node https"-t kerestem a Google-on, de a jóváhagyott válaszban szereplő példa nagyon régi - a jelenlegi (v21) node verzió dokumentációjából származik, így kellene kinéznie:
const https = require('node:https');
const fs = require('node:fs');
const options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'),
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
Válasz #4
A fenti válaszok jók, de az Expresszel és a node-dal ez rendben fog működni.
Mivel az express létrehozza az alkalmazást neked, ezt itt kihagyom.
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});
Válasz #5
Egy HTTPS szerver minimális beállítása Node.js-ben valahogy így nézne ki:
const https = require('node:https');
const fs = require('node:fs');
const httpsOptions = {
key : fs.readFileSync('path/to/server-key.pem'),
cert : fs.readFileSync('path/to/server-crt.pem')
};
const app = function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}
https.createServer(httpsOptions, app).listen(4433);
const options = {
key : fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert : fs.readFileSync('test/fixtures/keys/agent2-cert.pem'),
};
Ha HTTP-kéréseket is támogatni szeretnél, csak ezt a kis módosítást kell elvégezned:
const http = require('node:http');
const https = require('node:https');
const fs = require('node:fs');
const httpsOptions = {
key : fs.readFileSync('path/to/server-key.pem'),
cert : fs.readFileSync('path/to/server-crt.pem')
};
const app = function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}
http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
Válasz #6
Frissítés
Használja a Let's Encrypt-et a Greenlock.js segítségével
Eredeti bejegyzés
Észrevettem, hogy egyik válasz sem mutatja, hogy a lánchoz hozzáadva egy Intermediate Root CA-t, íme néhány zero-config példa, amivel lehet játszadozni, hogy lássuk:
- https://github.com/solderjs/nodejs-ssl-example
- http://coolaj86.com/articles/how-to-create-a-csr-for-https-tls-ssl-rsa-pems/
- https://github.com/solderjs/nodejs-self-signed-certificate-example
Kivonat :
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);
});
Ez egyike azoknak a dolgoknak, amelyek gyakran könnyebbek, ha nem próbálod közvetlenül a connect vagy express segítségével megtenni, hanem hagyod, hogy a natív https modul kezelje, majd ezt használod arra, hogy kiszolgáld a connect/express alkalmazásodat.
Ha emellett a server.on('request', app) használatát választod ahelyett, hogy az appot a szerver létrehozásakor adnád át, akkor lehetőséged nyílik arra, hogy a server példányt átadd egy inicializáló függvénynek, amely létrehozza a connect/express appot (például ha ugyanazon a szerveren szeretnél websocketeket SSL-en keresztül).
Válasz #7
Ahhoz, hogy az alkalmazásod egyszerre hallgathasson a http és a https protokollokra a 80 és a 443 portokon, tedd a következőt
Hozz létre egy expressz alkalmazást:
var express = require('express');
var app = express();
Az express() által visszaadott alkalmazás egy JavaScript függvény. Átadható a Node HTTP szervereinek visszahívóként a kérések kezelésére. Ez egyszerűvé teszi, hogy ugyanazzal a kódbázissal biztosítsd az alkalmazás HTTP és HTTPS verzióit is.
A következőképpen teheti meg:
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);
A teljes részletekért lásd a dokumentumot
