Як встановити сертифікат SSL для сервера express.js?


128

Перед тим, як у старшій версії експресу я міг це зробити:

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

Однак у нових версіях express це більше не працює:

var app = express();

Чи потрібно дзвонити, app.use()щоб встановити certs? Якщо так, як?

Відповіді:


151

Перегляньте документи Express , а також документи Node для https.createServer (саме те, що експрес рекомендує використовувати):

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


Хммм від вузла: https.createServer (параметри, [requestListener]), так що програма з програмою в порядку? Хіба що додаток не є 'об’єктом' ...
murvinlai

1
що таке підпис функції для програми? я намагаюся шукати на github для експресу, але я не бачу, що це потрібно (req, res)
murvinlai

1
Погляньте на визначення createServerв connect.js(express просто успадковує це від підключення). Ви побачите, що він повертає функцію з правильним підписом. connect()просто псевдонім для connect.createServer()і тому так є express()(що, ймовірно, робить додаткову ініціалізацію, але результат все-таки є функцією, придатною для використання як обробник запиту).
ebohlman

11
@Qix - у прикладі ОП appвизначено. Ця відповідь задовільна.
Сейрія

4
Чи є контур, як отримати .pem файли? У мене є два .crt файли від мого постачальника cert.
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");
});

1
Як ви насправді бачите світ привіт у браузері? 127.0.0.1:8000 дає мені помилку 107 (нетто: ERR_SSL_PROTOCOL_ERROR): помилка протоколу SSL.
aCuria

заборонено занадто рано. Я отримую - Помилка: addListener приймає лише випадки функції
Meekohi

майте на увазі, що це було написано досить давно. Можливо, це більше не працює в нових версіях 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 отримати поточний каталог

при цьому вимагайте () використання ./ зверніться до поточного каталогу.

Спочатку ви поміщаєте файл 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.