Перейти к содержимому

Создаём HTTPS Server на Node.js

Путь

Данная статья является вольным переводом статьи Creating an HTTPS Server with Node.js [1] с моими дополнениями.

Перейдём непосредственно к Node.JS, с помощью которого мы будем создавать HTTPS сервер по верх платформы Express.

Начинаем установку express. Следующая команда установит экспресс и сохранит его в папке node_modules.

npm i express -g

Создадим новый файл с расширением .js и зададим ему имя app.js. В данный файл мы добавим несколько строк. Для этого с помощью функции require включим в наш файл модуль express для дальнейшего использования. Экземпляр модуля express будет приложение app. Тоже самое происходит с модулем fs. fs — это API предоставляющее Node функции для чтения/записи файлов из/в каталоги. Мы будем использовать fs (файловую систему) для чтения наших файлов сертификатов SSL.

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

Теперь, самая важная часть. Получить SSL сертификат. Стандартный сертификат SSL поставляется с двумя важными файлами: первичный сертификат и промежуточный сертификат. Чтобы получить SSL, вам нужно генерировать CSR на вашем сервере для проверки. Также нам нужно сгенерировать ключ (закрытый ключ) для поддержки HTTPS-соединения с сервером. Выполнение следующей команды в среде linux даст нам наши искомые файлы mydomain.csr и private.key.

openssl req -new -newkey rsa:2048 -nodes -out mydomain.csr -keyout private.key

Используйте .csr файл для создания сертификатов и сохраните сгенерированный сертификаты (.crt) и файла private.key в корневом каталоге вашего проекта (например в папке encryption).

Примечание переводчика:

Из текста статьи не ясно как сгенерировать файлы .crt. Для этого можно воспользоваться статьёй [2]. 

CSR-файл — это запрос подписи сертификата. Он содержит информацию, необходимую для создания сертификата на основе вашего закрытого ключа и информации о вашем сайте

CER — это сам сертификат (который вы устанавливаете в свой веб-браузер). В принципе нет возможности конвертировать напрямую из одного в другой, поскольку вам нужен ключ для подписания сертификата, но что может сделать, это создать самозаверяющий сертификат (например, сертификат, подписанный тем же ключом, который использовался для его создания):

openssl x509 -req -in mydomain.csr -signkey server.key -out server.crt

 

Теперь нужно прочитать эти файлы и запустить наш HTTPS-сервер. Следовательно будем выполнять чтение и сохранения в буфер в соответствующих переменных. Имейте в виду, что вы читаете свои файлы с помощью функции readFileSync а, не readFile. Функция readFileSync имеет тенденцию блокировать  во время чтения файла, гарантирующего, что все файлы сертификатов будут прочитаны, прежде чем пытаться создать соединение.

var key = fs.readFileSync('encryption/private.key');
var cert = fs.readFileSync( 'encryption/primary.crt' );
var ca = fs.readFileSync( 'encryption/intermediate.crt' );

После этого мы создадим переменную options, для файлов сертификатов, например так,

var options = {
  key: key,
  cert: cert,
  ca: ca
};

и создадим наш сервер с помощью опции и приложения (экземпляр express, который мы создавали ранее, помните?), который будет прослушивать все подключения на порту 443 (порт по умолчанию для https).

var https = require('https');
https.createServer(options, app).listen(443);

Сохраним файл и запустим.

node app.js

Если все правила соблюдены и сертификаты были правильно созданы для домена, который вы используете,  чтобы указать на ваш сервер, вы увидите зеленую панель https слева от адресной строки. Однако есть ловушка. Мы еще не убедились, что наш HTTP-трафик направлен на HTTPS. Давайте сделаем это.

Мы создадим ещё один сервер, который будет работать на стороне HTTPS и перенаправлять трафик на него.

var http = require('http');
http.createServer(app).listen(80);

Это создаст HTTP-сервер, прослушивающий порт 80 (порт по умолчанию для http), и теперь ваш домен работает как на HTTP, так и на HTTPS.  Что бы заставить использовать HTTPS используем промежуточный слой express-force-ssl. Ниже будет показано как установить express-force-ssl:

npm i express-force-ssl

и это создаст промежуточный слой для нашего использования.

var forceSsl = require('express-force-ssl');

Давайте настроим промежуточный слов с помощью установки нашего модуля express.

app.use(forceSsl);

Ну вот и всё.  Express теперь будет знать, что мы хотим направить наш HTTP-трафик на HTTPS и преобразуем каждый HTTP-запрос в https.

Примечание

Это будет работать для небольших проектов, в частности тех проектов, которые не нуждаются в более быстром соединении, поскольку перенаправление на стороне сервера имеет тенденцию увеличивать задержку. Для более быстрого подключения такая настройка не рекомендуется. Вместо этого используйте NGINX поверх сервера Node.js и позвольте ему обрабатывать трафик (HTTP и HTTPS, включая перенаправления).

Примечание переводчика

Из статьи так и не ясно как создать файлы primary.crt и intermediate.crt, но в комментариях автор уточняет что сертификат можно купить. От себя добавлю, что можно воспользоваться бесплатным сервисом, например SSL For Free.

Ссылки

  1. Creating an HTTPS Server with Node.js (SSL setup done right): https://blog.cloudboost.io/everything-about-creating-an-https-server-using-node-js-2fc5c48a8d4e
  2. How to convert .csr to .cer (or whatever usable on Windows):
    https://stackoverflow.com/questions/7064087/how-to-convert-csr-to-cer-or-whatever-usable-on-windows
  3. Установка корневых сертификатов в Linux Mint / Ubuntu / Debian: http://www.voip-lab.ru/ustanovka-kornevyx-sertifikatov-v-linux-mint-ubuntu-debian/
  4. SSL For Free: https://www.sslforfree.com/

 

 

Добавить комментарий