Come creare un server HTTPS in Node.js?

Data una chiave SSL e un certificato, come si crea un servizio HTTPS?

Ho trovato il seguente esempio.

https://web.archive.org/web/20120203022122/http://www.silassewell.com/blog/2010/06/03/node-js-https-ssl-server-example/

Funziona per il nodo v0.1.94 – v0.3.1. server.setSecure() viene rimosso nelle versioni più recenti del nodo.

Direttamente da quella fonte:

 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); 

Il documento API Express lo spiega chiaramente.

Inoltre questa risposta fornisce i passaggi per creare un certificato autofirmato.

Ho aggiunto alcuni commenti e uno snippet dalla documentazione HTTPS di 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); 

Ho trovato questa domanda mentre cercavo su google “nodo https” ma l’esempio nella risposta accettata è molto vecchio – preso dai documenti della versione corrente (v0.10) del nodo, dovrebbe assomigliare a questo:

 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); 

Le risposte di cui sopra sono buone ma con Express e node funzionerà correttamente.

Dal momento che Express crea l’app per te, la salterò qui.

 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}); 

Ho notato che nessuna di queste risposte mostra che aggiungendo una CA radice intermedia alla catena, qui ci sono alcuni esempi di zero-config con cui giocare per vedere che:

Frammento:

 var options = { key: fs.readFileSync(path.join('certs', 'my-server.key.pem')) , ca: [ fs.readFileSync(path.join('certs', 'my-root-ca.crt.pem'))] , cert: fs.readFileSync(path.join('certs', 'my-server.crt.pem')) , requestCert: false , rejectUnauthorized: 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); }); 

Questa è una di quelle cose che è spesso più facile se non provi a farlo direttamente tramite connect o express, ma lascia che sia il modulo https nativo a gestirlo e poi usalo per servirti connect / express app.

Inoltre, se si utilizza server.on('request', app) anziché passare l’app durante la creazione del server, ti dà la possibilità di passare l’istanza del server a una qualche funzione di inizializzazione che crea l’app connect / express (se vuoi ad esempio, websocket su ssl sullo stesso server).

L’installazione minima per un server HTTPS in Node.js sarebbe qualcosa del genere:

 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); 

Se vuoi anche supportare le richieste http, devi fare solo questa piccola modifica:

 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); 

Per consentire alla tua app di ascoltare sia http che https sulle porte 80 e 443 rispettivamente, fai quanto segue

Crea un’app express:

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

L’app restituita da express() è una funzione JavaScript. Può essere passato ai server HTTP del nodo come richiamo per gestire le richieste. Ciò semplifica la fornitura delle versioni HTTP e HTTPS della tua app utilizzando la stessa base di codice.

Puoi farlo come segue:

 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); 

Per i dettagli completi vedi il doc

 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'); }); 
  1. Scarica il file rar per openssl da qui: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. Basta copiare la cartella nel drive c.
  3. Creare il file openssl.cnf e scaricare il loro contenuto da: http://web.mit.edu/crypto/openssl.cnf openssl.cnf può essere messo in qualsiasi posto, ma il percorso deve essere corretto quando diamo in prompt dei comandi.
  4. Aprire il comando propmt e impostare il percorso openssl.cnf C: \ set OPENSSL_CONF = d: /openssl.cnf 5. Eseguire questa operazione in cmd: C: \ openslsl-0.9.8r-i386-win32-rev2> openssl.exe
  5. Quindi eseguire OpenSSL> genrsa -des3 -out server.enc.key 1024
  6. Quindi chiederà le frasi di passaggio: inserire da 4 a 11 caratteri come password per il certificato
  7. Quindi eseguire questo Openssl> req -new -key server.enc.key -out server.csr
  8. Quindi chiederà alcuni dettagli come il nome dello stato del codice paese ecc. Riempirlo liberamente. 10. Quindi eseguire Openssl> rsa -in server.enc.key -out server.key
  9. Esegui questo OpenSSL> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt quindi utilizza il codice precedente che si trova nello stack overflow Grazie