¿Cómo configuro un certificado SSL para un servidor express.js?

128

Antes, en una versión anterior de express, podía hacer esto:

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

Sin embargo, en las versiones más recientes de express, esto ya no funciona:

var app = express();

¿Debo llamar app.use()para establecer los certificados? ¿Si es así, cómo?

murvinlai
fuente

Respuestas:

151

Consulte los documentos de Express así como los documentos de Node para https.createServer (que es lo que Express recomienda usar):

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

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

Otras opciones para createServer están en: http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener

ebohlman
fuente
Hmmm desde el nodo: https.createServer (opciones, [requestListener]), ¿entonces pasar la aplicación está bien? no es que la aplicación es un 'objeto' ...
murvinlai
1
¿Cuál es la firma de la función para 'aplicación'? Intento buscar en github para express pero no veo que se necesita (req, res)
murvinlai
1
Eche un vistazo a la definición de createServerin connect.js(express simplemente hereda esto de connect). Verá que devuelve una función con la firma correcta. connect()es simplemente un alias para connect.createServer()y, por lo tanto, también lo es express()(lo que probablemente hace una inicialización adicional, pero el resultado sigue siendo una función apropiada para usar como un controlador de solicitud).
ebohlman
11
@Qix: en el ejemplo de OP, appestá definido. Esta respuesta es satisfactoria.
Seiyria
44
¿Hay algún esquema de cómo obtener los archivos .pem? Tengo dos archivos .crt de mi proveedor de certificados.
SCBuergel.eth
103

Pude hacer que SSL funcionara con el siguiente código repetitivo:

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
fuente
1
¿Cómo ves el mundo hola en el navegador? 127.0.0.1:8000 me da un error 107 (net :: ERR_SSL_PROTOCOL_ERROR): error de protocolo SSL.
aCuria
votó demasiado pronto Obtengo - Error: addListener solo toma instancias de Function
Meekohi
tenga en cuenta que fue escrito hace bastante tiempo. Es posible que esto ya no funcione en las versiones más recientes de Express o Node.js
geoffreak
8
Esto es años demasiado tarde, pero el SSL_PROTOCOL_ERROR puede ser causado por el hecho de que está utilizando http: // <ssl_enabled_endpoint>. Debería ser https: // <ssl_enabled_endpoint>
andreimarinescu
9

Este es mi código de trabajo para express 4.0 .

express 4.0 es muy diferente de 3.0 y otros.

4.0 tiene el archivo / bin / www, que va a agregar https aquí.

"npm start" es la forma estándar de iniciar el servidor express 4.0.

La función readFileSync () debe usar __dirname obtener el directorio actual

mientras require () use ./ consulte el directorio actual.

Primero coloca el archivo private.key y public.cert en la carpeta / bin, es la misma carpeta que el archivo WWW .

no hay tal directorio encontrado error:

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

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

error, no se encontró dicho directorio

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

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

El código de trabajo debe ser

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

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

El código https completo es:

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
fuente