Instalare și Automatizare SSL pe Node.js folosind ACME

Tipărire
  • 0

Automatizarea 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.

Răspunsul a fost util?