Автоматизация SSL для Node.js через ACME (acme.sh)

Печать
  • 0

Автоматизация SSL/TLS для Node.js приложений с использованием ACME сертификатов обеспечивает безопасное соединение без ручного обновления.

Данное руководство использует клиент acme.sh с External Account Binding (EAB) и описывает установку, выпуск сертификатов, интеграцию с PM2, настройку HTTPS и проверку автообновления.

Node.js сервер

Требования:

  • ACME SSL подписка с EAB (EAB_KID и EAB_HMAC_KEY)
  • Установленные Node.js и npm (node -v, npm -v)
  • Домен, направленный на сервер
  • Работающее Node.js приложение (порт 80)
  • Установленный PM2
  • Root/sudo доступ
  • Доступ к ACME серверу (например https://acme.sectigo.com/v2/DV)

1. Установка acme.sh

curl https://get.acme.sh | sh
source ~/.bashrc
acme.sh --version

Примечание: убедитесь, что установлены curl и git.

2. Регистрация ACME аккаунта (EAB)

acme.sh --register-account \
--server https://acme.sectigo.com/v2/DV \
--eab-kid EAB_KID \
--eab-hmac-key EAB_HMAC_KEY \
--accountemail you@example.com

Параметры:

  • SERVER — ACME сервер
  • EAB_KID — идентификатор аккаунта
  • EAB_HMAC_KEY — ключ авторизации
  • accountemail — email уведомлений

3. Запуск Node.js через PM2

3.1 Установка PM2

sudo npm install -g pm2
pm2 --version

3.2 Запуск приложения

pm2 start server.js --name yourapp-site

3.3 Автозапуск

pm2 startup systemd
pm2 save
pm2 status

4. Выпуск SSL сертификата (Webroot)

acme.sh --issue \
-d yourdomain.com \
-d www.yourdomain.com \
-w /path/to/project/public \
--server https://acme.sectigo.com/v2/DV

Важно: webroot должен совпадать с директорией Express.

5. Установка сертификата в Node.js

5.1 Создание папки

mkdir -p ~/yourapp-site/cert

5.2 Установка сертификата

acme.sh --install-cert -d yourdomain.com \
--key-file /path/to/ssl/yourdomain.key \
--fullchain-file /path/to/ssl/yourdomain.crt \
--reloadcmd "pm2 restart yourapp-site"

Примечание: приложение будет автоматически перезапускаться при обновлении сертификата.

5.3 Права доступа

sudo chown root:root /path/to/ssl/*
sudo chmod 600 /path/to/ssl/yourdomain.key
sudo chmod 644 /path/to/ssl/yourdomain.crt

Для non-root пользователя:

sudo chown <user>:<group> /path/to/ssl/yourdomain.key
sudo chmod 600 /path/to/ssl/yourdomain.key

6. Включение HTTPS в Node.js

6.1 Импорт модулей

const express = require('express');
const fs = require('fs');
const https = require('https');
const http = require('http');
const path = require('path');

6.2 Настройка Express

const app = express();

app.use(express.static(path.join(__dirname, 'public')));

app.use(
'/.well-known/acme-challenge',
express.static(path.join(__dirname, 'public', '.well-known', 'acme-challenge'), { dotfiles: 'allow' })
);

6.3 Главный маршрут

app.get('/', (req, res) => {
res.send('Hello from yourdomain.com (HTTPS enabled)');
});

6.4 Редирект HTTP → HTTPS

http.createServer((req, res) => {
res.writeHead(301, { Location: 'https://' + req.headers.host + req.url });
res.end();
}).listen(80);

6.5 HTTPS сервер

https.createServer({
key: fs.readFileSync('/path/to/ssl/yourdomain.key'),
cert: fs.readFileSync('/path/to/ssl/yourdomain.crt')
}, app).listen(443);
pm2 restart yourapp-site

7. Проверка и автообновление

  • Откройте https://yourdomain.com
  • Проверьте валидность сертификата
crontab -l
acme.sh --renew -d yourdomain.com --force

Устранение проблем

  • Порт 80 закрыт — проверьте firewall / lsof -i:80
  • Unauthorized — проверьте EAB и ACME сервер
  • Standalone conflict — используйте только webroot режим

Помог ли вам данный ответ?

Нужна помощь? Позвоните нам +373 795-800-80