Как настроить SSL-сертификат для сервера express.js?

128

Раньше в более старой версии Express я мог сделать это:

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

Однако в более новых версиях Express это больше не работает:

var app = express();

Должен ли я позвонить, app.use()чтобы установить сертификаты? Если да, то как?

murvinlai
источник

Ответы:

151

См. Документацию Express, а также документацию Node для https.createServer (именно это рекомендует использовать Express):

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

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

Другие варианты createServer находятся по адресу: http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener

ebohlman
источник
Хммм с узла: https.createServer (options, [requestListener]), значит, передача приложения в порядке? разве это приложение не является «объектом» ...
мурвинлай
1
какова сигнатура функции для "приложения"? Я пытаюсь найти экспресс на github, но не вижу, что для этого требуется (req, res)
Murvinlai
1
Взгляните на определение createServerin connect.js(express просто наследует это от connect). Вы увидите, что он возвращает функцию с правильной подписью. connect()является просто псевдонимом для connect.createServer()и, следовательно, так и есть express()(что, вероятно, выполняет некоторую дополнительную инициализацию, но результатом по-прежнему является функция, подходящая для использования в качестве обработчика запросов).
ebohlman 06
11
@Qix - в примере OPs appопределяется. Это удовлетворительный ответ.
Сейрия
5
есть ли какая-нибудь схема, как получить файлы .pem? У меня есть два файла .crt от поставщика сертификатов.
SCBuergel.eth
103

Мне удалось заставить SSL работать со следующим шаблонным кодом:

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
источник
1
Как вы на самом деле видите приветственный мир в браузере? 127.0.0.1:8000 дает мне ошибку 107 (net :: ERR_SSL_PROTOCOL_ERROR): ошибка протокола SSL.
aCuria
проголосовали слишком рано. Я получаю - Ошибка: addListener принимает только экземпляры функции
Микохи
имейте в виду, что это было написано довольно давно. Возможно, это больше не работает в новых версиях Express или Node.js
geoffreak
8
Это слишком поздно, но ошибка SSL_PROTOCOL_ERROR может быть вызвана тем, что вы используете http: // <ssl_enabled_endpoint>. Это должно быть https: // <ssl_enabled_endpoint>
andreimarinescu
9

Это мой рабочий код для экспресс 4.0 .

Express 4.0 сильно отличается от 3.0 и других.

4.0 у вас есть файл / bin / www, который вы собираетесь добавить сюда https.

"npm start" - стандартный способ запуска сервера Express 4.0.

Функция readFileSync () должна использовать __dirname для получения текущего каталога

в то время как require () использует ./ относится к текущему каталогу.

Сначала вы помещаете файлы private.key и public.cert в папку / bin, это та же папка, что и файл WWW .

нет такой ошибки в каталоге:

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

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

ошибка, такой каталог не найден

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

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

Рабочий код должен быть

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

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

Полный код https:

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
источник