Автоматизация SSL для Node.js через ACME (acme.sh)
ПечатьАвтоматизация 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 режим