Настроить Let's Encrypt для Express

Как настроить HTTPS с помощью популярного бесплатного решения Let's Encrypt

Если вы запускаете приложение Node.js на своем собственном VPS, вам понадобится решение для получения сертификатов SSL.

Сегодня стандартом для этого является использованиеДавайте зашифроватьиCertbot, инструмент отEFF, известная как Electronic Frontier Foundation, ведущая некоммерческая организация, занимающаяся вопросами конфиденциальности, свободы слова и гражданских свобод в цифровом мире в целом.

Вот шаги, которые мы будем выполнять:

Установить Certbot

Эти инструкции предполагают, что вы используете Ubuntu, Debian или любой другой дистрибутив Linux, который используетapt-getдля управления пакетами:

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

Вы также можете установить Certbot на Mac в целях тестирования (требуетсяДомашнее пиво):

brew install certbot

Однако вам нужно будет связать это с реальным доменным именем, чтобы оно было полезным.

Создайте сертификат SSL с помощью Certbot

Теперь, когда Certbot установлен, вы можете вызвать его для создания сертификата. Вы должны запустить это как root:

certbot certonly --manual

… Или вызовите sudo от пользователя без полномочий root:

sudo certbot certonly --manual

Это процесс в деталях:

Установщик попросит вас указать домен вашего сайта.

… Затем он запрашивает ваш адрес электронной почты:

➜ sudo certbot certonly --manual
Password: XXXXXXXXXXXXXXXXXX
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [email protected]

… И принять Условия использования:

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory

(A)gree/©ancel: A

… И для разрешения поделиться своим адресом электронной почты:

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

… Наконец, мы можем ввести домен, в котором мы хотим использовать сертификат SSL:

Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): copesflavio.com

… Установщик спрашивает, можно ли записать ваш IP-адрес:

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for copesflavio.com

NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you’re running certbot in manual mode on a machine that is not your server, please ensure you’re okay with that.

Are you OK with your IP being logged?


(Y)es/(N)o: y

… И, наконец, мы подошли к этапу проверки!

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c

And make it available on your web server at this URL:

http://copesflavio.com/.well-known/acme-challenge/TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E

Теперь оставим Certbot в покое на пару минут.

Нам нужно подтвердить, что мы владеем доменом, создав файл с именемTS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2Eв.well-known/acme-challenge/папка. Обращать внимание! Странная строка, которую я только что вставил, будет меняться каждый раз, когда вы будете проходить через этот процесс.

Вам нужно будет создать папку и файл, поскольку по умолчанию они не существуют.

В этот файл вам нужно поместить контент, который распечатал Certbot:

TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c

Что касается имени файла - эта строка уникальна каждый раз, когда вы запускаете Certbot.

Разрешить Express обслуживать статические файлы

Чтобы обслуживать этот файл из Express, вам необходимо включить обслуживание статических файлов. Вы можете создатьstaticпапку и добавьте туда.well-knownвложенную папку, затем настройте Express следующим образом:

const express = require('express')
const app = express()

//… app.use(express.static(__dirname + ‘/static’, { dotfiles: ‘allow’ }))

//…

Вdotfilesопция обязательна, иначе.well-known, который является точечным файлом (поскольку он начинается с точки), не будет отображаться. Это мера безопасности, потому что точечные файлы могут содержать конфиденциальную информацию, и их лучше сохранить по умолчанию.

Подтвердите домен

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

Получить сертификат

Вот и все! Если все прошло хорошо, Certbot создал сертификат и закрытый ключ и сделал их доступными в папке на вашем компьютере (и, конечно, он скажет вам, в какой папке).

Теперь просто скопируйте / вставьте пути в свое приложение, чтобы начать использовать их для обслуживания ваших запросов:

const fs = require('fs')
const https = require('https')
const app = express()

app.get(’/’, (req, res) => { res.send(‘Hello HTTPS!’) })

https .createServer( { key: fs.readFileSync(’/etc/letsencrypt/path/to/key.pem’), cert: fs.readFileSync(’/etc/letsencrypt/path/to/cert.pem’), ca: fs.readFileSync(’/etc/letsencrypt/path/to/chain.pem’), }, app ) .listen(443, () => { console.log(‘Listening…’) })

Обратите внимание, что я заставил этот сервер прослушивать порт 443, поэтому его нужно запускать с правами root.

Кроме того, сервер работает исключительно по HTTPS, потому что я использовалhttps.createServer(). Вы также можете развернуть HTTP-сервер рядом с этим, запустив:

http.createServer(app).listen(80, () => {
  console.log('Listening...')
})

https .createServer( { key: fs.readFileSync(’/etc/letsencrypt/path/to/key.pem’), cert: fs.readFileSync(’/etc/letsencrypt/path/to/cert.pem’), ca: fs.readFileSync(’/etc/letsencrypt/path/to/chain.pem’), }, app ) .listen(443, () => { console.log(‘Listening…’) })

Настроить продление

Сертификат SSL будет действителен только в течение 90 дней, поэтому вам необходимо настроить автоматическую систему для его продления.

Как? Использование задания cron.

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

В нашем случае мы будем запускать скрипт обновления два раза в день, как рекомендовано в документации Certbot.

Сначала узнайте абсолютный путьcertbotв вашей системе. я используюtype certbotна macOS, чтобы получить его, и в моем случае это в/usr/local/bin/certbot.

Вот сценарий, который нам нужно запустить:

certbot renew

Это запись задания cron:

0 */12 * * * root /usr/local/bin/certbot renew >/dev/null 2>&1

Выше сказано «запускать каждые 12 часов, каждый день: в 00:00 и в 12:00».

Совет: я создал эту строку, используяhttps://crontab-generator.org/

Добавьте ваш вновь созданный скрипт в системный crontab с помощью этой команды:

env EDITOR=pico crontab -e

Это открываетpicoредактор (не стесняйтесь заменить любым редактором, который вам больше нравится). Просто введите новый скрипт, сохраните, и задание cron будет установлено.

Как только это будет сделано, вы сможете увидеть список активных заданий cron, выполнив:

crontab -l

Скачать мою бесплатнуюСправочник Express.js


Дополнительные экспресс-руководства: