Weboldal keresés

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

Kapcsolódó cikkek