Como configuro um certificado SSL para um servidor express.js?

128

Antes, em uma versão mais antiga do express, eu podia fazer o seguinte:

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

No entanto, nas versões mais recentes do express, isso não funciona mais:

var app = express();

Devo ligar app.use()para definir as certs? Se sim, como?

murvinlai
fonte

Respostas:

151

Consulte os documentos Express e Node para https.createServer (que é o que o Express recomenda usar):

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

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

Outras opções para createServer estão em: http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener

ebohlman
fonte
Hmmm do nó: https.createServer (opções, [requestListener]) para que o aplicativo seja aprovado? não é esse app é um 'objeto' ...
murvinlai
1
qual é a assinatura da função para 'app'? eu tento olhar para cima no github para expressar, mas eu não vejo que é preciso (req, res)
murvinlai
1
Dê uma olhada na definição de createServerin connect.js(express apenas herda isso do connect). Você verá que ele retorna uma função com a assinatura correta. connect()é simplesmente um alias para connect.createServer()e, portanto, o é express()(o que provavelmente faz alguma inicialização extra, mas o resultado ainda é uma função apropriada para uso como manipulador de solicitações).
ebohlman
11
@Qix - no exemplo dos OPs, appestá definido. Esta resposta é satisfatória.
Seiyria
4
existe algum esquema de como obter os arquivos .pem? Eu tenho dois arquivos .crt do meu provedor de certificação.
SCBuergel.eth
103

Consegui obter o SSL funcionando com o seguinte código padrão:

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
fonte
1
Como você vê o mundo olá no navegador? 127.0.0.1:8000 me fornece um erro 107 (net :: ERR_SSL_PROTOCOL_ERROR): erro de protocolo SSL.
aCuria
votado muito cedo. Eu recebo - Erro: addListener leva apenas instâncias de Function
Meekohi
tenha em mente que foi escrito há muito tempo. É possível que este já não funciona em versões mais recentes do Express ou Node.js
geoffreak
8
Isso é muito tarde, mas o SSL_PROTOCOL_ERROR pode ser causado pelo fato de você estar usando http: // <ssl_enabled_endpoint>. Deve ser https: // <ssl_enabled_endpoint>
andreimarinescu
9

Este é o meu código de trabalho para o Express 4.0 .

O Express 4.0 é muito diferente do 3.0 e de outros.

4.0 você tem o arquivo / bin / www, que você adicionará https aqui.

"npm start" é a maneira padrão de iniciar o servidor express 4.0.

A função readFileSync () deve usar __dirname get directory atual

Enquanto require () use ./, consulte o diretório atual.

Primeiro, você coloca o arquivo private.key e public.cert na pasta / bin. É a mesma pasta do arquivo WWW .

nenhum desses diretórios encontrou erro:

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

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

erro, nenhum diretório encontrado

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

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

Código de trabalho deve ser

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

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

O código https completo é:

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
fonte