Instalare și Automatizare SSL pe Node.js folosind ACME
TipărireAutomatizarea SSL/TLS pentru aplicațiile Node.js folosind certificate ACME asigură securitatea site-ului fără intervenție manuală la reînnoire.
Acest ghid folosește clientul acme.sh împreună cu External Account Binding (EAB) și explică instalarea, emiterea certificatelor, integrarea cu PM2, configurarea HTTPS și verificarea auto-reînnoirii.
Server Node.js
Cerințe preliminare:
- ACME SSL subscription cu EAB (EAB_KID și EAB_HMAC_KEY)
- Node.js și npm instalate (node -v, npm -v)
- Domeniu configurat către server
- Aplicație Node.js funcțională (port 80)
- PM2 instalat
- Acces root/sudo
- Acces outbound la serverul ACME (ex: https://acme.sectigo.com/v2/DV)
1. Instalare acme.sh
Instalare client ACME:
curl https://get.acme.sh | sh
Încărcare mediu și verificare:
source ~/.bashrc
acme.sh --version
Tip: asigurați-vă că curl și git sunt instalate.
2. Înregistrare cont ACME (EAB)
Înregistrare la CA folosind 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
Parametri:
- SERVER – URL ACME furnizat de CA
- EAB_KID – ID de cont ACME
- EAB_HMAC_KEY – cheie de autentificare
- accountemail – email notificări
3. Rulare aplicație Node.js cu PM2
3.1 Instalare PM2
sudo npm install -g pm2
pm2 --version
3.2 Pornire aplicație
pm2 start server.js --name yourapp-site
3.3 Auto-start la reboot
Pentru root:
pm2 startup systemd
Salvare proces:
pm2 save
Verificare:
pm2 status
4. Emitere certificat SSL (Webroot)
Emitere certificat folosind folderul static al aplicației:
acme.sh --issue \
-d yourdomain.com \
-d www.yourdomain.com \
-w /path/to/project/public \
--server https://acme.sectigo.com/v2/DV
Important: folderul -w trebuie să fie același cu cel servit de Node.js (express.static).
5. Instalare certificat în Node.js
5.1 Creare folder SSL
mkdir -p ~/yourapp-site/cert
5.2 Instalare certificat
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"
Notă: aplicația va fi restartată automat după reînnoire.
5.3 Permisiuni fișiere SSL
sudo chown root:root /path/to/ssl/*
sudo chmod 600 /path/to/ssl/yourdomain.key
sudo chmod 644 /path/to/ssl/yourdomain.crt
Pentru utilizatori non-root:
sudo chown <user>:<group> /path/to/ssl/yourdomain.key
sudo chmod 600 /path/to/ssl/yourdomain.key
6. Activare HTTPS în Node.js
6.1 Import module
const express = require('express');
const fs = require('fs');
const https = require('https');
const http = require('http');
const path = require('path');
6.2 Configurare 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 Route principal
app.get('/', (req, res) => {
res.send('Hello from yourdomain.com (HTTPS enabled)');
});
6.4 Redirect HTTP → HTTPS
http.createServer((req, res) => {
res.writeHead(301, { Location: 'https://' + req.headers.host + req.url });
res.end();
}).listen(80);
6.5 Server HTTPS
https.createServer({
key: fs.readFileSync('/path/to/ssl/yourdomain.key'),
cert: fs.readFileSync('/path/to/ssl/yourdomain.crt')
}, app).listen(443);
Restart aplicație:
pm2 restart yourapp-site
7. Verificare și auto-reînnoire
Verificare SSL:
- Accesați https://yourdomain.com
- Verificați certificatul valid
Verificare cron:
crontab -l
Test reînnoire:
acme.sh --renew -d yourdomain.com --force
Troubleshooting
- Port 80 blocat – verificați firewall / lsof -i:80
- Unauthorized – verificați EAB și server ACME
- Standalone conflict – folosiți doar webroot mode.