Как создать сервер HTTPS в Node.js?

361

При наличии SSL-ключа и сертификата, как создать службу HTTPS?

murvinlai
источник
2
Я использовал restify.js вместо express.js , но идея та же. Вот как я настроил сервер node.js, который принимает HTTP и HTTPS. Qugstart.com/blog/node-js/…
awaage
2
без экспресса и с самой новой версией узла - смотрите здесь: stackoverflow.com/a/21809393/388026
pkyeck
1
Что случилось с этим вопросом? Ответы подразумевают, что это было первоначально о express.js.
doug65536
тривиально создать действительный самоподписанный сертификат SSL и запустить HTTPS-сервер всего за несколько шагов
Lloyd
3
Немного поздно, но если кому-то нужен полный учебник по https для nodejs, вы можете найти здесь: programmerblog.net/nodejs-https-server
Джейсон

Ответы:

151

Я нашел следующий пример.

https://web.archive.org/web/20120203022122/http://www.silassewell.com/blog/2010/06/03/node-js-https-ssl-server-example/

Это работает для узла v0.1.94 - v0.3.1. server.setSecure()удаляется в более новых версиях узла.

Непосредственно из этого источника:

const crypto = require('crypto'),
  fs = require("fs"),
  http = require("http");

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

var credentials = crypto.createCredentials({key: privateKey, cert: certificate});

var handler = function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
};

var server = http.createServer();
server.setSecure(credentials);
server.addListener("request", handler);
server.listen(8000);
hvgotcodes
источник
3
setSecureустарел. Проверьте это вместо этого stackoverflow.com/questions/5136353/node-js-https-secure-error
Ларри Битва
7
Смотрите официальный экспресс-ответ ниже @Jacob Marble.
clayzermk1
21
Этот образец больше не работает, так как реализация HTTPS была заново выполнена в Node.JS 0.4. Смотрите соответствующие документы на nodejs.org. stackoverflow.com/questions/5136353/…
scottyab
11
Этот ответ очень старый и больше не работает. Пожалуйста, посмотрите ответ pkyeck ниже или перейдите по адресу
Джей Шет,
2
Также ссылка не работает
TlonXP
484

В документе Express API это объясняется довольно четко.

Кроме того, в этом ответе приведены шаги по созданию самозаверяющего сертификата.

Я добавил несколько комментариев и фрагмент из документации по HTTPS для Node.js :

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

// This line is from the Node.js HTTPS documentation.
var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert')
};

// Create a service (the app object is just a callback).
var app = express();

// Create an HTTP service.
http.createServer(app).listen(80);
// Create an HTTPS service identical to the HTTP service.
https.createServer(options, app).listen(443);
Джейкоб Мрамор
источник
49
Хорошо, как раз собирался опубликовать это сам. Спасибо. Кроме того, я нашел эту статью полезной для создания самозаверяющего сертификата.
clayzermk1
1
Убедитесь, что вы вставили optionsсначала https.createServer, чтобы избежать загадочных ошибок.
Wberry
1
Я настраиваю почти идентичный порт сервера https 8888 и не знаю, как изменить маршруты. когда я запускаю curl curl --insecure localhost: 8888 curl: (35) Неизвестная ошибка протокола SSL при подключении к localhost: 8888 с чем связана ошибка и как ее обойти. Когда я набираю localhost: 8888 в браузере, он зависает и https: / localhost: 8888 выдает ошибку SSL
reza
2
@Costa вы можете перенаправлять пользователей с http на https с помощью express-force-ssl или рукописного промежуточного программного обеспечения - это довольно просто
floatdrop
1
@NathanMcKaskle Вы можете отключить пароль: проверьте это руководство, но если вы используете macOS, убедитесь, что длина сгенерированного ключа составляет не менее 2048:openssl genrsa -out key.pem 2048
sakisk
87

Нашел этот вопрос, когда гуглил "узел https", но пример в принятом ответе очень старый - взят из документов текущей (v0.10) версии узла, он должен выглядеть следующим образом:

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

var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);
pkyeck
источник
Работал как шарм. Эта информация очень пригодилась, когда я запустил инструмент node.js (PDFJS) поверх приложения PHP, которое недавно было вынуждено запускать через https. Программа iframe была очень недовольна тем, что загружала мое приложение node.js на альтернативный порт, отличный от https.
lewsid
2
Это выглядит хорошо, но как я могу создать файлы, которые вам нужны ( *.pem)? Я пытался перейти на эту страницу , но при открытии localhost:8000в браузере данные не были получены (просто загрузка ...).
Ионика Бизэ
7
@ IonicăBizau, для генерации ключей установите openssl, затем в командной строке cmd введитеopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
mido
2
@ IonicăBizeve, вам нужно напрямую перейти к https://localhost:8080. HTTP не является HTTPS.
Флориан Вендельборн
Можно ли создать https-сервер с папкой? Таким образом, вы можете поместить в него файл и получить к нему доступ, например, localhost: 81 / main.js
FrenkyB
47

Приведенные выше ответы хороши, но с Express и node это будет работать нормально.

Поскольку Express создаст приложение для вас, я пропущу это здесь.

var express = require('express')
  , fs = require('fs')
  , routes = require('./routes');

var privateKey = fs.readFileSync('cert/key.pem').toString();
var certificate = fs.readFileSync('cert/certificate.pem').toString();  

// To enable HTTPS
var app = module.exports = express.createServer({key: privateKey, cert: certificate});
nu1silva
источник
Технически это более правильный ответ, поскольку вопрос заключался в том, как это сделать с помощью Express.js
Като,
12
Похоже, это не рекомендуется, поскольку «приложения больше не наследуют от http.Server»
Мерлин Морган-Грэм,
2
Почему ты сидишь module.exports? В этом нет необходимости
Matej
1
@matejkramny, вероятно, потому что это облегчает тестирование.
Джастин
21

Минимальная настройка HTTPS-сервера в Node.js будет выглядеть примерно так:

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);

Если вы также хотите поддерживать http-запросы, вам нужно сделать только эту небольшую модификацию:

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
Джон Слегерс
источник
18

Обновить

Используйте Let's Encrypt через Greenlock.js

Оригинальный пост

Я заметил, что ни один из этих ответов не показывает, что добавление промежуточного корневого CA в цепочку, вот несколько примеров с нулевой конфигурацией, с которыми можно поиграть:

Отрывок:

var options = {
  // this is the private key only
  key: fs.readFileSync(path.join('certs', 'my-server.key.pem'))

// this must be the fullchain (cert + intermediates)
, cert: fs.readFileSync(path.join('certs', 'my-server.crt.pem'))

// this stuff is generally only for peer certificates
//, ca: [ fs.readFileSync(path.join('certs', 'my-root-ca.crt.pem'))]
//, requestCert: false
};

var server = https.createServer(options);
var app = require('./my-express-or-connect-app').create(server);
server.on('request', app);
server.listen(443, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

var insecureServer = http.createServer();
server.listen(80, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

Это одна из тех вещей, которые часто проще, если вы не пытаетесь сделать это напрямую через connect или express, но позвольте нативному httpsмодулю обработать это, а затем использовать это для обслуживания вашего приложения connect / express.

Кроме того, если вы используете server.on('request', app)вместо передачи приложения при создании сервера, это дает вам возможность передать serverэкземпляр какой-то функции инициализатора, которая создает приложение connect / express (если вы хотите использовать websockets через ssl на том же сервере, для пример).

CoolAJ86
источник
Это хорошее объяснение, но предоставленная ссылка в разделе обновлений не работает (выдает ошибку 500)
Чаки
8

Чтобы включить приложение для прослушивания как httpи httpsна порты 80и , 443соответственно, выполните следующие действия

Создать экспресс-приложение:

var express = require('express');
var app = express();

Возвращаемое приложение express()является функцией JavaScript. Он может быть передан на HTTP-серверы Node как обратный вызов для обработки запросов. Это позволяет легко предоставлять как HTTP, так и HTTPS версии вашего приложения, используя одну и ту же кодовую базу.

Вы можете сделать это следующим образом:

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

var options = {
  key: fs.readFileSync('/path/to/key.pem'),
  cert: fs.readFileSync('/path/to/cert.pem')
};

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

Для полной детализации смотрите документацию

CMD
источник
0

Вы также можете использовать это в архиве с платформой Fastify:

const { readFileSync } = require('fs')
const Fastify = require('fastify')

const fastify = Fastify({
  https: {
    key: readFileSync('./test/asset/server.key'),
    cert: readFileSync('./test/asset/server.cert')
  },
  logger: { level: 'debug' }
})

fastify.listen(8080)

(и запустить openssl req -nodes -new -x509 -keyout server.key -out server.certдля создания файлов, если вам нужно написать тесты)

Мануэль Спиголон
источник
-4
  1. Загрузите rar-файл для openssl, настроенный здесь: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. Просто скопируйте вашу папку на диске c.
  3. Создайте файл openssl.cnf и загрузите его содержимое с: http://web.mit.edu/crypto/openssl.cnf Openssl.cnf можно поместить в любое место, но путь будет правильным, если мы дадим в командной строке.
  4. Откройте команду propmt и задайте путь openssl.cnf C: \ set OPENSSL_CONF = d: /openssl.cnf 5. Запустите его в cmd: C: \ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. Затем запустите OpenSSL> genrsa -des3 -out server.enc.key 1024
  6. Затем он попросит ввести пароль: введите от 4 до 11 символов в качестве пароля для сертификата.
  7. Затем запустите этот Openssl> req -new -key server.enc.key -out server.csr
  8. Затем он запросит некоторые детали, такие как название страны, код страны и т. Д., Заполните ее свободно. 10 Затем запустите Openssl> rsa -in server.enc.key -out server.key
  9. Запустите этот OpenSSL> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt, а затем используйте предыдущий код, переполняющий стек Спасибо
Эр Шубхам Патидар
источник
1
это ОТ . Вопрос ОП понятен. Сертификаты уже предоставлены.
Мартин Шнайдер