Let's encrypt і express

HTTPS стає все більш сильним трендом сучасного інтернету. І це добре, особливо, коли клієнти, взаємодіючи з серверами, обмінюються з ними конфіденційними даними. Для того, щоб користуватися HTTPS, потрібен SSL-сертифікат, який застосовується для перевірки автентичності сервера. Проект Let's Encrypt значно спростив процес отримання SSL-сертифікатів. До його появи все було набагато складніше.

Let's encrypt і express


Let's Encrypt використовує Certbot від Electronic Frontier Foundation для автоматизації процесу отримання SSL-сертифіката. Підтримуються різні типи веб-серверів (Apache, nginx, і інші), які працюють на Unix-подібних ОС. Якщо ваш сервер відповідає системним вимогам Let's Encrypt, це означає, що ви зможете отримати сертифікат в практично повністю автоматичному режимі. На жаль, зв'язку Node.js / Express.js Let's Encrypt не підтримує. Тобто, в даному випадку автоматично отримати сертифікат від Certbot не вийде. Однак, не все втрачено. Використовуючи Let's Encrypt і Certbot, сертифікат не так вже й складно отримати вручну.

попередні відомості

Ми збираємося використовувати Certbot в режимі webroot, запускаючи його з ключем --webroot. Якщо в двох словах, то в цьому режимі Certbot розмістить файл в якійсь директорії нашого сервера, яка повинна бути доступна по протоколу HTTP.

За допомогою Express обслуговувати директорії, що містять статичні файли, можна, використовуючи функцію express.static ().

План робіт

Для отримання сертифікату і підтримки його актуальності нам знадобиться пройти через п'ять етапів:

  1. Перенаправити відповідні порти.
  2. Налаштувати структуру директорій для статичних файлів і організувати її обслуговування за допомогою Express.
  3. Встановити і запустити Certbot.
  4. Налаштувати Express на використання HTTPS.
  5. Оновити сертифікат Let's Encrypt через 90 днів.

Нижче опишемо ці етапи докладніше, з прикладами коду і команд.

перенаправлення портів

Упевнений, це ні в кого труднощів не викличе, але, для повноти викладу, опишу цей крок.

Для успішного проходження процесу верифікації потрібно URL сервера. Certbot буде використовувати цей URL для того, щоб зв'язатися з сервером і отримати дані по HTTP. Це означає, що порт 80 на наданому URL повинен бути доступний з інтернету. Не завадить відкрити і порт 443, так як це порт HTTPS за замовчуванням.

Особисто я віддаю перевагу тримати мої Express-сервера на портах, номери яких вище, ніж 1024, а потім, використовуючи правила перенаправлення, передавати трафік з портів 80 або 443 на сервера. Як результат, мені не потрібно давати Express підвищені привілеї, що безпечніше, особливо з огляду на те, що веб-сервер буде обробляти потенційно небезпечний трафік.

Якщо звернутися до кінцевої точки health-check за допомогою curl. на те, що все в порядку, вкаже відповідь HTTP 200.

Коли мережу і сервер готові до роботи, можна переходити до налаштування обслуговування статичних файлів.

Обслуговування статичних файлів

Вищенаведена команда виконується з кореня проекту, при цьому мається на увазі, що директорія для статичних даних має ім'я static.

Тепер, після того, як Express налаштований на обслуговування правильної папки, перевіримо працездатність системи.

Якщо в консоль буде виведений текст «this is a test», значить даний крок успішно завершений і можна йти далі - до створення нового SSL-сертифіката.

Перший крок на цьому етапі - установка Certbot. Тут можна знайти інструкції по установці. А саме, щоб їх побачити, в поле I'm using виберіть None of the above. потім, в наступному полі, виберіть вашу ОС. Після цього буде показана команда для установки. Наприклад, для Ubuntu 16.04 (xenial) ця команда виглядає так: sudo apt-get install letsencrypt.

Наступний крок полягає в тому, щоб згенерувати сертифікат. Як вже було сказано, ми збираємося запустити Certbot в режимі webroot. Для цього знадобиться передати йому шлях, який буде використаний в якості кореня веб-сервера (використовуючи ключ -w), і доменне ім'я (за допомогою ключа -d). В даному випадку команда виглядає так:

Відмінно! Ось він, наш новенький SSL-сертифікат. Тепер задіємо його.

Express і HTTPS

Крім того, рекомендується або скопіювати файли fullchain.pem і privkey.pem в директорію проекту, або створити символічні посилання на них. Створення символічних посилань спрощує процес оновлення, але що саме вибрати - залежить лише від вас.

Нижченаведений код заснований на припущенні про те, що файли fullchain.pem і privkey.pem знаходяться в папці sslcert в директорії проекту.

Крім того, тут не завадить Helmet.js. Цей пакет допомагає захищати Express-сервера, керуючи HTTP-заголовками. Він, крім іншого, додає HSTS. прибирає заголовок X-Powered-By і встановлює заголовок X-Frame-Options для захисту від клікджекінга.

Встановити його дуже просто:

Після установки Helmet, його можна задіяти в Express як проміжний шар обробки даних.

Тепер, щоб остаточно переконатися в тому, що все працює, можна перевірити сервер за допомогою чогось на кшталт SSL Server Test.

оновлення сертифіката

Сертифікати Let's Encrypt діють 90 днів. Добре це чи погано - сперечатися безглуздо, особливо з огляду на те, що процес оновлення сертифіката дуже простий. А саме, для поновлення сертифіката досить виконати команду letsencrypt renew і Certbot випустить новий сертифікат. Рекомендується автоматизувати цей процес, використовуючи або завдання cron. або щось на зразок systemd.

У підсумку, якщо налаштувати Express на обслуговування статичних файлів за специфічним шляху, використовували Certbot в режимі webroot для створення сертифіката сервера і підключили HTTPS в Express, використовуючи щойно створений сертифікат. Хоча автоматичний процес взаємодії з Certbot нам і не доступний, зробити вручну все, що треба, не так вже й складно.

Хочеться сподіватися, що Certbot, в доступному для огляду майбутньому, оснастять підтримкою Node.js.

А як ви отримуєте SSL-сертифікати для Express-серверів? Чи користуєтеся сертифікатами від Let's Encrypt?

Схожі статті