Étant donné une clé et un certificat SSL, comment créer un service HTTPS?
Étant donné une clé et un certificat SSL, comment créer un service HTTPS?
Réponses:
J'ai trouvé l'exemple suivant.
Cela fonctionne pour le nœud v0.1.94 - v0.3.1. server.setSecure()
est supprimé dans les versions plus récentes du nœud.
Directement à partir de cette source:
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
est obsolète. Vérifiez plutôt stackoverflow.com/questions/5136353/node-js-https-secure-error
Le document de l'API Express le dit assez clairement.
De plus, cette réponse donne les étapes pour créer un certificat auto-signé.
J'ai ajouté quelques commentaires et un extrait de la documentation HTTPS de 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
premier https.createServer
, pour éviter les erreurs cryptiques.
J'ai trouvé cette question lors de la recherche sur "nœud https", mais l'exemple de la réponse acceptée est très ancien - tiré des documents de la version actuelle (v0.10) du nœud, il devrait ressembler à ceci:
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
)? J'ai essayé de suivre cette page , mais lors de l'ouverture localhost:8000
dans le navigateur, aucune donnée n'est reçue (juste chargement ...).
openssl
, puis dans l'invite cmd, tapezopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
https://localhost:8080
. HTTP n'est PAS HTTPS.
Les réponses ci-dessus sont bonnes mais avec Express et node cela fonctionnera bien.
Puisque express crée l'application pour vous, je vais sauter cela ici.
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
? Il n'y a pas besoin de ça
La configuration minimale pour un serveur HTTPS dans Node.js serait quelque chose comme ceci:
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);
Si vous souhaitez également prendre en charge les requêtes http, vous devez simplement effectuer cette petite modification:
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);
Utilisez Let's Encrypt via Greenlock.js
J'ai remarqué qu'aucune de ces réponses ne montre que l'ajout d'une autorité de certification racine intermédiaire à la chaîne, voici quelques exemples de configuration zéro pour jouer avec pour voir que:
Fragment:
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);
});
C'est l'une de ces choses qui est souvent plus facile si vous n'essayez pas de le faire directement via connect ou express, mais laissez le https
module natif le gérer et ensuite l'utiliser pour vous servir de l'application connect / express.
De plus, si vous utilisez server.on('request', app)
au lieu de passer l'application lors de la création du serveur, cela vous donne la possibilité de passer l' server
instance à une fonction d'initialisation qui crée l'application connect / express (si vous voulez faire des websockets sur ssl sur le même serveur, pour exemple).
Pour activer votre application pour écouter les deux http
et https
sur les ports 80
et 443
respectivement, procédez comme suit
Créez une application express:
var express = require('express');
var app = express();
L'application renvoyée par express()
est une fonction JavaScript. Il peut être transmis aux serveurs HTTP de Node en tant que rappel pour gérer les demandes. Cela facilite la fourniture des versions HTTP et HTTPS de votre application en utilisant la même base de code.
Vous pouvez le faire comme suit:
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);
Pour plus de détails, voir le doc
Vous pouvez également l'archiver avec le 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)
(et lancez openssl req -nodes -new -x509 -keyout server.key -out server.cert
pour créer les fichiers si vous avez besoin d'écrire des tests)