Data una chiave SSL e certificato, come si crea un servizio HTTPS?
Data una chiave SSL e certificato, come si crea un servizio HTTPS?
Risposte:
Ho trovato il seguente esempio.
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);
setSecure
è deprecato. Dai un'occhiata invece a stackoverflow.com/questions/5136353/node-js-https-secure-error
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);
options
primo https.createServer
, per evitare errori criptici.
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);
*.pem
)? Ho provato a seguire questa pagina , ma quando si apre localhost:8000
nel browser, non vengono ricevuti dati (solo caricamento ...).
openssl
, quindi nel prompt cmd, digitaopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
https://localhost:8080
. HTTP NON è HTTPS.
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});
module.exports
? Non ce n'è bisogno
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);
Usa Let's Encrypt tramite Greenlock.js
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' server
istanza a una funzione di inizializzazione che crea l'app connect / express (se vuoi fare websocket su ssl sullo stesso server, per esempio).
Per abilitare l'app in ascolto per entrambe http
e https
su porte 80
e 443
rispettivamente, 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
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.cert
per creare i file se devi scrivere test)