HTTPS стає все більш сильним трендом сучасного інтернету. І це добре, особливо, коли клієнти, взаємодіючи з серверами, обмінюються з ними конфіденційними даними. Для того, щоб користуватися HTTPS, потрібен SSL-сертифікат, який застосовується для перевірки автентичності сервера. Проект Let's Encrypt значно спростив процес отримання SSL-сертифікатів. До його появи все було набагато складніше.
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 ().
План робіт
Для отримання сертифікату і підтримки його актуальності нам знадобиться пройти через п'ять етапів:
- Перенаправити відповідні порти.
- Налаштувати структуру директорій для статичних файлів і організувати її обслуговування за допомогою Express.
- Встановити і запустити Certbot.
- Налаштувати Express на використання HTTPS.
- Оновити сертифікат 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?