web-dev-qa-db-fra.com

Comment créer un serveur HTTPS dans Node.js?

Avec une clé SSL et un certificat, comment créer un service HTTPS?

333
murvinlai

J'ai trouvé l'exemple suivant.

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

Cela fonctionne pour le noeud v0.1.94 - v0.3.1. server.setSecure() est supprimé des nouvelles versions de node.

Directement 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);
145
hvgotcodes

Le Express API doc le précise assez clairement.

De plus, cette réponse indique les étapes à suivre pour créer un certificat auto-signé.

J'ai ajouté quelques commentaires et un extrait de la documentation Node.js HTTPS :

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);
456
Jacob Marble

Vous avez trouvé cette question en cherchant "noeud https" dans Google, mais l'exemple dans le réponse acceptée est très ancien - tiré du docs de la version actuelle (v0.10) du noeud, ça devrait ressembler à ça:

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

Les réponses ci-dessus sont bonnes, mais avec Express et noeud, cela fonctionnera bien.

Depuis express créer l'application pour vous, je vais sauter 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});
48
nu1silva

La configuration minimale pour un serveur HTTPS dans Node.js ressemblerait à 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 juste apporter 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);
18
John Slegers

Mise à jour

Utilisez Let's Encrypt via Greenlock.js

Poste originale

J'ai remarqué qu'aucune de ces réponses n'indique que l'ajout d'un autorité de certification racine intermédiaire à la chaîne, en voici quelques-uns zéro exemples de configuration avec lesquels voir:

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 une de ces choses qui est souvent plus facile si vous n’essayez pas d’essayer de le faire directement via connect ou express, mais laissez le natif https Le module le gère et l’utilise ensuite pour vous servir d’application Connect/Express.

De même, si vous utilisez server.on('request', app) au lieu de transmettre l'application lors de la création du serveur, vous avez également la possibilité de transmettre l'instance server à une fonction d'initialisation qui crée l'application connect/express (si vous le souhaitez. do websockets sur SSL sur le même serveur, par exemple).

18
CoolAJ86

Pour permettre à votre application d'écouter à la fois http et https sur les ports 80 et 443, procédez comme suit:

Créer 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 traiter 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

8
cmd