Come creare un server HTTPS in Node.js?


361

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


2
Ho usato restify.js invece di express.js, ma l'idea è la stessa. Ecco come ho impostato un server node.js che accetta sia HTTP che HTTPS qugstart.com/blog/node-js/…
attesa del

2
senza l'espressa e con la nuova versione del nodo - sguardo qui: stackoverflow.com/a/21809393/388026
pkyeck

1
Che cosa è successo a questa domanda? Le risposte implicano che si trattava originariamente di express.js.
doug65536,

è banale creare un certificato SSL autofirmato valido e avviare un server HTTPS, in pochi passaggi
Lloyd,

3
È un po 'tardi, ma se qualcuno ha bisogno di un tutorial https di nodejs completo, puoi trovare qui: programmerblog.net/nodejs-https-server
Jason W,

Risposte:


151

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

3
setSecureè deprecato. Dai un'occhiata invece a stackoverflow.com/questions/5136353/node-js-https-secure-error
Larry Battle,

7
Vedi la risposta espressa ufficiale di seguito da @Jacob Marble.
clayzermk1,

21
Questo esempio non funziona più poiché l'implementazione HTTPS è stata rifatta in Node.JS 0.4. Consulta i documenti corrispondenti su nodejs.org. stackoverflow.com/questions/5136353/...
scottyab

11
Questa risposta è molto antica e non funziona più. Si prega di vedere la risposta dal pkyeck di seguito, o andare a: nodejs.org/api/https.html
Jay Sheth

2
Anche il collegamento è interrotto
TlonXP

484

Il documento Express API 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);

49
Bello, stavo per pubblicare questo da solo. Grazie. Inoltre, ho trovato utile questo articolo per generare un certificato autofirmato.
clayzermk1,

1
Assicurati di inserire per optionsprimo https.createServer, per evitare errori criptici.
wberry

1
Sto configurando una porta del server https 8888 quasi identica e non sono sicuro di come modificare i percorsi. quando eseguo curl curl --insecure localhost: 8888 curl: (35) Errore protocollo SSL sconosciuto in connessione a localhost: 8888 da dove proviene l'errore e come aggirarlo . Quando digito localhost: 8888 nel browser, si blocca e https: / localhost: 8888 restituisce errore SSL
reza

2
@Costa puoi reindirizzare gli utenti da http a https con express-force-ssl o middleware scritto a mano - è abbastanza semplice
floatdrop

1
@NathanMcKaskle Puoi disabilitare la password: controlla questa guida ma se stai usando macOS assicurati che la lunghezza della chiave generata sia almeno 2048:openssl genrsa -out key.pem 2048
sakisk

87

Ho trovato questa domanda mentre cercavo su Google "nodo https" ma l'esempio nella risposta accettata è molto vecchio - preso dai documenti dell'attuale versione (v0.10) del nodo, dovrebbe apparire così:

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

Ha funzionato come un fascino. Queste informazioni sono state molto utili quando eseguo uno strumento node.js (PDFJS) su un'app PHP che è stata recentemente costretta a correre su https. L'iframe è stato molto scontento di caricare la mia app node.js su una porta alternativa non https.
lewsid,

2
Questo sembra buono, ma come posso generare i file necessari lì ( *.pem)? Ho provato a seguire questa pagina , ma quando si apre localhost:8000nel browser, non vengono ricevuti dati (solo caricamento ...).
Ionică Bizău,

7
@ IonicăBizău, per generare le chiavi, installa openssl, quindi nel prompt cmd, digitaopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
mido

2
@ IonicăBizău devi andare direttamente a https://localhost:8080. HTTP NON è HTTPS.
Florian Wendelborn,

È possibile creare https-server con cartella? Quindi puoi inserire il file al suo interno e accedere a quel file come localhost: 81 / main.js
FrenkyB

47

Le risposte sopra sono buone ma con Express e node funzionerà bene.

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

Questa è tecnicamente la risposta più corretta, dal momento che la domanda era come farlo con Express.js
Kato

12
Questo sembra essere deprecato dal momento che "le applicazioni non ereditano più da http.Server"
Merlyn Morgan-Graham

2
Perché ti metti module.exports? Non ce n'è bisogno
Matej l'

1
@matejkramny, probabilmente perché semplifica i test.
Giustino,

21

L'impostazione 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 supportare anche le richieste http, devi apportare 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);

18

Aggiornare

Usa Let's Encrypt tramite Greenlock.js

Posta originale

Ho notato che nessuna di queste risposte mostra che aggiungendo una CA radice intermedia alla catena, ecco alcuni esempi di configurazione zero con cui giocare per vedere che:

Frammento:

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

Questa è una di quelle cose che è spesso più semplice se non provi a farlo direttamente tramite connect o express, ma lascia che il nativohttps modulo lo gestisca e quindi lo usi per servire la tua app connect / express.

Inoltre, se usi server.on('request', app)invece di passare l'app durante la creazione del server, ti dà la possibilità di passare l' serveristanza a una funzione di inizializzazione che crea l'app connect / express (se vuoi fare websocket su ssl sullo stesso server, per esempio).


Questa è una bella spiegazione ma, il link fornito nella sezione di aggiornamento, è rotto (dà 500 errori)
Chucky

8

Per abilitare l'app in ascolto per entrambe httpe httpssu porte 80e 443rispettivamente, procedi come 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 di Node come callback per gestire le richieste. Ciò semplifica fornire entrambe le 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 consultare il doc


0

Puoi usare anche questo archivio con il framework 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)

(ed esegui openssl req -nodes -new -x509 -keyout server.key -out server.certper creare i file se devi scrivere test)


-4
  1. Scarica il file rar per openssl configurato da qui: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. Basta copiare la cartella nell'unità c.
  3. Crea il file openssl.cnf e scarica il loro contenuto da: http://web.mit.edu/crypto/openssl.cnf openssl.cnf può essere inserito ovunque ma il percorso deve essere corretto quando diamo nel prompt dei comandi.
  4. Apri il comando propmt e imposta il percorso openssl.cnf C: \ set OPENSSL_CONF = d: /openssl.cnf 5. Esegui questo in cmd: C: \ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. Quindi eseguire OpenSSL> genrsa -des3 -out server.enc.key 1024
  6. Quindi chiederà le passphrase: inserisci da 4 a 11 caratteri come password per il certificato
  7. Quindi esegui questo Opensl> req -new -key server.enc.key -out server.csr
  8. Quindi chiederà alcuni dettagli come il nome dello stato del codice paese, ecc., Riempilo liberamente. 10 Quindi Esegui Openssl> rsa -in server.enc.key -out server.key
  9. Esegui 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

1
questo è OT . La domanda del PO è chiara. I certificati sono già stati dati.
Martin Schneider,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.