Запуск вашего веб-сервера без SSL может создать впечатление, что ваш контент небезопасен. Chrome показывает неприятную пометку «Небезопасно» рядом с вашим доменом. Это отстой.

Но для начала обслуживания через HTTP на сервере Node / Express требуется всего 30 минут вашего времени. Просто следуйте инструкциям в этом руководстве по SSL.



Просто подписывайтесь на меня в Twitter, чтобы получать обновления моих бесплатных руководств по программированию.

SSL-соединения по протоколу HTTPS

SSL шифрует исходящие и входящие данные между клиентом и сервером. Это помогает повысить безопасность таких данных, как номера кредитных карт, электронные письма и пароли. При использовании протокола HTTP данные отправляются как есть. (Возможно, он был сжат, но не зашифрован алгоритмом шифрования.)

Это важно, потому что, если вы не реализуете SSL, данные, отправляемые на сервер, небезопасны. Также Chrome и другие браузеры будут отображать сообщение «Небезопасно» рядом с вашим доменным именем, что может помешать пользователям покупать ваши продукты.

К счастью для нас, в Node уже есть модуль под названием https:

// Import the https module
let https = require("https");
// Choose port based on whether we're on
// loaclhost or production server
const port = process.env.node_env === 'production' ? 443 : 3000;
// Link to generated certificate files
// (replace example.com with your own domain name)
// (see how to generate them later in this tutorial)
const key = `/etc/letsencrypt/live/example.com/privkey.pem`;
const cert = `/etc/letsencrypt/live/example.com/fullchain.pem`;
const options = {
    key: fs.readFileSync(key),
    cert: fs.readFileSync(cert)
};
https.createServer(options, function(request, response) {
    
    /* Your SSL server is running */
    
    /* Of course here... you would write your API implementation */
    
}).listen(port);

Но если вы используете Express, вам даже не нужно этого. Express просто возьмет массив файлов сертификатов, указывающих на сертификаты, которые мы сгенерируем позже в этом руководстве. Вот пример Express.js:

// Import packages
const express = require('express');
const https = require('https');
const port = 443;
// Create Express app
const app = express();
let site = 'example.com';
let port = 443;
// Link to generated certificate files
// (replace example.com with your own domain name)
// (see how to generate them later in this tutorial)
const key = `/etc/letsencrypt/live/${site}/privkey.pem`;
const cert = `/etc/letsencrypt/live/${site}/fullchain.pem`;
const certificates = {
    "key": fs.readFileSync(key),
    "cert": fs.readFileSync(cert)
};
const server = event => {
    console.log(`${site} is listening on port ${port}!`);
};
// Launch Node server with Express "app"
https.createServer(certificates, app).listen(port, server);

Помните, что каждый раз, когда вы добавляете новый оператор require в свое приложение, вам также необходимо установить связанный с ним пакет:

npm install https — save

Директива - save добавляет пакет в файл package.json.

Теперь мы можем использовать этот модуль https для запуска нашего сервера. Но этого мало. Самая важная часть - это настройка сертификата SSL, чтобы сервер установил соединение с центром сертификации перед обслуживанием контента и появился значок замка:

Значок замка на бесконечном закате - моем безопасном приложении PWA.

Мы будем использовать LetsEncrypt - это бесплатно и легко настроить. В отличие от openssl, LetsEncrypt генерирует SSL-сертификаты производственного качества, которых должно хватить для всего.

Давайте зашифровать

Давайте перейдем к настройке бесплатных сертификатов SSL в операционных системах на базе Linux. Предпочтительная ОС для большинства провайдеров веб-хостинга. Однако команды, описанные в этом разделе, одинаковы в Терминале и bash.exe в Windows.

Чтобы использовать LetsEncrypt, мы должны обновить пакеты, установить git (, если вы еще этого не сделали,), клонировать и установить letsencrypt репозиторий и выполните несколько команд bash.

Без особой причины я буду использовать bash.exe в Windows 10, но вы можете использовать Терминал в OSX. Сначала я запускаю bash.exe из меню «Пуск». Откроется окно командной строки:

Войдите на свой веб-хостинг как пользователь root, используя команду ssh. Просто замените xx.xxx.xx.xxx статическим IP-адресом, на котором вы размещаете свой веб-сайт.

Вам будет предложено ввести пароль пользователя root (если у вас не настроен вход без пароля, но это выходит за рамки этого руководства.)

Теперь мы должны войти на веб-хостинг. См. Журнал сервера ниже:

Вы увидите экран, похожий на этот. (Я использую Ubuntu 18.)

Чтобы установить certbot, нам нужно сначала обновить пакеты. Это связано с тем, что разработчики certbot продолжают применять улучшения, и на вашем сервере Ubuntu может не быть последней версии при начальной установке сервера.

Запустите команду sudo add-apt-repository ppa: certbot / certbot, чтобы добавить репозиторий certbot на свой сервер Ubuntu:

Просто нажмите Enter, и последние пакеты будут добавлены в файлы зеркала, представляющие собой список ссылок, указывающих на последнюю версию пакетов.

Теперь запустите sudo apt-get update, чтобы загрузить обновленные пакеты:

Этот шаг важен - он обновит ваши пакеты certbot до последней версии.

Если вы оказались на CentOS или Debian, вы можете сделать то же самое следующим образом:

В CentOS запустите sudo yum update && sudo yum upgrade

В Debian запустите sudo apt update && sudo apt upgrade.

Символы && в Linux приведут к обновлению ваших пакетов с последующим обновлением без необходимости выполнять каждую команду отдельно.

Установка certbot

Запустите apt-get install certbot, чтобы установить пакет certbot. Мы уже вошли в систему как root, поэтому нет необходимости использовать команду sudo (в противном случае также добавьте sudo.)

Нажмите Y, а затем Enter. Или выполните ту же команду с флагом -y или - yes. На экране появится журнал установки, и после этого все будет в порядке!

Установка git

Чтобы установить letsencrypt, нам нужно клонировать последнюю версию git. Но для этого нам сначала нужно убедиться, что у нас есть git установлен в нашей системе:

Процесс установки будет прокручиваться на вашем экране…

Теперь мы можем использовать git. Если вы находитесь в Терминале, скорее всего, у вас уже есть установщики пакетов apt или apt-get. Имейте в виду, что в этом примере мы используем bash.exe в Windows 10. Если sudo или apt-get не работают, имеется обходной путь.

Во-первых ... если вы размещаете свой сервер удаленно, используйте ssh в bash.exe для входа на свой сервер, и все команды Linux станут доступны оттуда.

Во-вторых, если вы разрабатываете на localhost и вам не нужно входить на удаленный хост, вы должны установить Ubuntu для Windows в дополнение к bash.exe . После установки у вас должны быть apt-get и другие распространенные команды Linux в вашем Windows 10 bash.

Клонирование letsencrypt

Теперь мы готовы клонировать последнюю версию letsencrypt на наш сервер. Это достигается с помощью следующей команды Linux:

git clone https://github.com/letsencrypt/letsencrypt / opt / letsencrypt

Просто скопируйте и вставьте его в свой Терминал или в bash!

Вы также можете поставить перед ним sudo, как показано в следующем примере.

Создать сертификат SSL

Наконец, мы готовы создать сертификат SSL, который в конечном итоге позволит нам обслуживать файлы через https вместо http. Следуя предыдущим шагам, введите эту команду, чтобы перейти во вновь созданный каталог letsencrypt:

cd / opt / letsencrypt

Вы перейдете в папку, в которую только что был установлен textbf {letsencrypt}.

cd означает "Изменить каталог" в ОС на базе Linux.

После этого выполните следующую команду…

sudo -H ./letsencrypt-auto certonly - автономный -d A.com -d www.A.com

(Только не забудьте заменить A.com своим доменным именем.)

Инициируйте создание сертификата SSL для example.com (снова убедитесь, что он соответствует вашему доменному имени, а не example.)

После этого вы увидите команду letsencrypt-auto, которая генерирует необходимые файлы сертификатов с помощью certbot и автоматически создает запросы http.

На этом этапе вам могут задать несколько вопросов. Я не собираюсь включать их здесь, чтобы сэкономить место в книге. Просто введите свой адрес электронной почты, когда вас спросят, и многое другое. Каждый раз при запросе выбирайте вариант (A) приветствую или (Y) es (обязательно).

Давайте посмотрим, что на самом деле произошло после создания сертификата.

Выделены важные части:

LetsEncrypt создал и проверил HTTP-вызовы (это необходимо для проверки того, что доменное имя принадлежит вам, но в данном случае это делается для нас автоматически.). сгенерировал два ключа pem для нашего домена example.com.

Поздравляем с приобретением безопасного домена SSL!

На данный момент ваше доменное имя активировано https. Предположим, вы передали два ключа своему Node или Express, как показано в самом начале этого руководства. Просто перезапустите сервер, и вы должны увидеть безопасную блокировку в адресной строке.

Но есть еще один момент! Давайте проверим, где находятся файлы, и познакомимся с каталогом, в котором на самом деле были сгенерированы ключи:

Файлы сертификатов были созданы в каталоге / etc / letsencrypt / live.

Вывести содержимое live dir. Здесь letsencrypt сохранил все ключи сертификатов для всех доменных имен на сервере под соответствующими именами папок.

Запустите команду ls, чтобы просмотреть содержимое каталога. Вы увидите, что на нашем сайте example.com теперь есть папка (должно отображаться ваше доменное имя).

В каталоге example.com вы найдете несколько файлов pem, сгенерированных letsencrypt. Нам нужны только cert.pem и privkey.pem. Мы готовы начать использовать сертификат. Все, что нам нужно сделать, это добавить новый код в существующий файл index.js.

ACME Challenge

Если вы выполнили шаги по установке сертификата SSL в предыдущем разделе, вам не нужно делать следующий шаг. Но в некоторых случаях для проверки того, что вы являетесь владельцем доменного имени, требуются вызовы ACME в некоторых конфигурациях сервера.

Запустите certbot certonly - manual или certbot certonly - manual (обратите внимание, что на самом деле это двойной дефис, как показано ниже, а не один тире.)

Если вы размещаете несколько доменов, вы можете использовать один и тот же сертификат, поэтому просто укажите столько доменных имен, сколько вам нужно, через пробел или запятую. В данном случае мы просто добавляем пример сайта awesomesite.com.

Введите имя вашего домена (без www.) И нажмите Enter.

Введите Y и нажмите Enter, чтобы согласиться и продолжить.

Чтобы убедиться, что доменное имя принадлежит нам, нам нужно вручную создать файл с именем afBX9EXvQqUqzFooe02–22EfJ5TzcniFw7CvqlaMXCA - только часть перед точкой (.), Выделенную желтым на скриншоте выше.

Поместите этот файл в каталог .well-known / acme-challenge на вашем сервере. (В t корневой папке вашего сайта.) Возможно, вам сначала придется создать эти папки.

Теперь отредактируйте содержимое этого файла, вставив в него всю строку, сгенерированную certbot. В нашем случае это длинный текст afBX9EXvQqUqzFooe02–22EfJ5TzcniFw7CvqlaMXCA.rX9ThTxJ4y47aLEr7xgEWcOm4v7Jr5kJeT4PLA98–0

Имейте в виду, что это имя файла будет генерироваться каждый раз, когда вы запускаете certbot. Так что, если вы уже запускали эту команду, ее следует изменить снова.

Чтобы продолжить, нажмите клавишу ВВОД.

Добавление файлов PEM для включения сервера HTTPS

Перейдите в каталог /etc/letsencrypt/live/site.com, чтобы убедиться, что файлы pem действительно были созданы в результате действий, предпринятых в предыдущем разделе.

Теперь, когда мы создали privkey.pem и cert.pem, нам нужно передать их в конфигурацию нашего сервера Node, используя options объект.

const express = require('express');
const https = require('https');
const port = 443;
// Create Express app
const app = express();
let site = 'example.com';
let port = 443;
const certificates = {
    "key": fs.readFileSync(`/etc/letsencrypt/live/${site}/privkey.pem`),
    "cert": fs.readFileSync(`/etc/letsencrypt/live/${site}/fullchain.pem`)
};
const server = event => {
    console.log(`${site} is listening on port ${port}!`);
};
// Launch Node server with Express "app"
https.createServer(certificates, app).listen(port, server);

Просто замените example.com своим фактическим доменным именем.

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

Обновите файл index.js указанным выше кодом. Войдите в свой веб-хостинг. Перейдите в корневой каталог вашего приложения и запустите индекс узла. Если на этом этапе все пойдет хорошо, ваш сервер будет доступен по протоколу https, и сообщение «Небезопасно» в Chrome (и некоторых других браузерах) должно исчезнуть.

Но есть еще кое-что ...

Обычный камень преткновения

цепочка сертификатов - это список сертификатов, который содержит сертификат SSL, промежуточные центры сертификации и корневой центр сертификации, который позволяет подключенному устройству проверять надежность сертификата SSL.

Это требуется для производственных серверов.

На этом этапе ваш сайт https откроется в Chrome и IE без проблем! Но если вы откроете его в Firefox, вы все еще можете увидеть значок замка. Firefox (среди многих других программ) основан на проверке цепочки сертификатов.

Чтобы правильно настроить сертификат, вам необходимо настроить цепочку сертификатов, а не только один ключ. Chrome и IE изящно игнорируют эту деталь и показывают соединения как безопасные.

Если вы не подключитесь к цепочке сертификатов, вы не сможете успешно проверить подключение https. Это может помешать таким вещам, как добавление карточек Twitter на ваш сайт (потому, что карточки Twitter с изображениями, хранящимися по адресу https, требуют проверки цепи) при поиске изображения вашей карточки через метаданные Twitter. теги.

И это всего лишь один пример. Если вы не подключитесь к цепочке сертификатов, может возникнуть множество проблем. К счастью для нас, решение простое. На предыдущих шагах давайте зашифруем уже созданный файл fullchain.pem в том же каталоге, что и cert.pem.

Все, что нам нужно сделать, это изменить cert.pem на fullchain.pem в предыдущем примере исходного кода следующим образом.

Измените следующую строку:

const cert = /etc/letsencrypt/live/site.com/cert.pem;

To:

const cert = /etc/letsencrypt/live/site.com/fullchain.pem;

Перезагрузите сервер Node с помощью node index.js, и у вас должен быть правильно установленный и полностью рабочий SSL-сертификат!

Вы можете подписаться на меня в Twitter, чтобы получать обновления моих бесплатных руководств по кодированию, или просто зайдите на эту страницу с моими книгами по кодированию на JavaScript и CSS, если вам нужна копия.