Comment configurer un certificat SSL pour un serveur express.js?

128

Avant, dans une ancienne version d'express, je pouvais faire ceci:

express.createServer({key:'keyFile', cert:'certFile'});

Cependant, dans les nouvelles versions d'express, cela ne fonctionne plus:

var app = express();

Dois-je appeler app.use()pour définir les certificats? Si c'est le cas, comment?

murvinlai
la source

Réponses:

151

Consultez la documentation Express ainsi que la documentation Node pour https.createServer (c'est ce qu'express recommande d'utiliser):

var privateKey = fs.readFileSync( 'privatekey.pem' );
var certificate = fs.readFileSync( 'certificate.pem' );

https.createServer({
    key: privateKey,
    cert: certificate
}, app).listen(port);

D'autres options pour createServer sont à l' adresse : http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener

ebohlman
la source
Hmmm depuis le nœud: https.createServer (options, [requestListener]) donc le passage de l'application est ok? Cette application n'est-elle pas un `` objet '' ...
murvinlai
1
quelle est la signature de fonction pour «app»? J'essaie de chercher sur github pour express mais je ne vois pas que cela prend (req, res)
murvinlai
1
Jetez un œil à la définition de createServerin connect.js(express hérite juste de cela de connect). Vous verrez qu'il renvoie une fonction avec la signature correcte. connect()est simplement un alias pour connect.createServer()et donc il en est de même express()(ce qui fait probablement une initialisation supplémentaire, mais le résultat est toujours une fonction appropriée pour être utilisée comme gestionnaire de requêtes).
ebohlman
11
@Qix - dans l'exemple OPs, appest défini. Cette réponse est satisfaisante.
Seiyria
4
existe-t-il un aperçu de la façon d'obtenir les fichiers .pem? J'ai deux fichiers .crt de mon fournisseur de certificat.
SCBuergel.eth
103

J'ai pu faire fonctionner SSL avec le code passe-partout suivant:

var fs = require('fs'),
    http = require('http'),
    https = require('https'),
    express = require('express');

var port = 8000;

var options = {
    key: fs.readFileSync('./ssl/privatekey.pem'),
    cert: fs.readFileSync('./ssl/certificate.pem'),
};

var app = express();

var server = https.createServer(options, app).listen(port, function(){
  console.log("Express server listening on port " + port);
});

app.get('/', function (req, res) {
    res.writeHead(200);
    res.end("hello world\n");
});
Geoffreak
la source
1
Comment voyez-vous réellement le monde Hello sur le navigateur? 127.0.0.1:8000 me donne une erreur 107 (net :: ERR_SSL_PROTOCOL_ERROR): erreur de protocole SSL.
aCuria
voté trop tôt. Je reçois - Erreur: addListener ne prend que des instances de Function
Meekohi
gardez à l'esprit que cela a été écrit il y a assez longtemps. Il est possible que cela ne fonctionne plus dans les nouvelles versions d'Express ou Node.js
geoffreak
8
C'est des années trop tard, mais SSL_PROTOCOL_ERROR peut être causé par le fait que vous utilisez http: // <ssl_enabled_endpoint>. Cela devrait être https: // <ssl_enabled_endpoint>
andreimarinescu
9

Ceci est mon code de travail pour express 4.0 .

express 4.0 est très différent de 3.0 et d'autres.

4.0 vous avez le fichier / bin / www, que vous allez ajouter https ici.

"npm start" est la manière standard de démarrer le serveur express 4.0.

La fonction readFileSync () doit utiliser __dirname obtenir le répertoire courant

tandis que require () use ./ se réfère au répertoire courant.

Tout d'abord, vous placez le fichier private.key et public.cert dans le dossier / bin, c'est le même dossier que le fichier WWW .

aucun répertoire n'a trouvé d'erreur:

  key: fs.readFileSync('../private.key'),

  cert: fs.readFileSync('../public.cert')

erreur, aucun répertoire de ce type n'a été trouvé

  key: fs.readFileSync('./private.key'),

  cert: fs.readFileSync('./public.cert')

Le code de travail doit être

key: fs.readFileSync(__dirname + '/private.key', 'utf8'),

cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')

Le code https complet est:

const https = require('https');
const fs = require('fs');

// readFileSync function must use __dirname get current directory
// require use ./ refer to current directory.

const options = {
   key: fs.readFileSync(__dirname + '/private.key', 'utf8'),
  cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')
};


 // Create HTTPs server.

 var server = https.createServer(options, app);
hoogw
la source