# Renovación Automática de Certificados SSL - EMQX
## iot.lambicall.com

---

## ✅ Estado de Configuración

**La renovación automática de certificados SSL está completamente configurada y funcionando.**

### Resultados de Prueba (Dry-Run)

```
✓ iot.lambicall.com - Renovación exitosa
✓ vpn.lambicall.com - Renovación exitosa
✓ erp.omitech.com.mx - Renovación exitosa
✓ phone.omitech.com.mx - Renovación exitosa
✓ mymsaindustrial.com - Renovación exitosa
```

**Certificado actual:**
- Dominio: iot.lambicall.com
- Válido hasta: Mar 6, 2026 (89 días restantes)
- Emisor: Let's Encrypt (E8)

---

## 🔄 Cómo Funciona la Renovación Automática

### 1. Timer de Certbot

Certbot tiene un timer de systemd que se ejecuta **2 veces al día**:

```bash
# Ver estado del timer
systemctl status certbot.timer

# Ver próxima ejecución
systemctl list-timers | grep certbot
```

**Configuración:**
- Se ejecuta a las 00:00 y 12:00 horas
- Con delay aleatorio de hasta 12 horas
- Automáticamente renovará certificados que expiren en menos de 30 días

### 2. Hook de Deployment

Cuando Certbot renueva el certificado de **iot.lambicall.com**, automáticamente:

1. Copia los nuevos certificados a `/etc/emqx/certs/`
2. Ajusta los permisos correctos
3. Reinicia EMQX para aplicar los cambios
4. Registra la renovación en `/var/log/emqx-cert-renewal.log`

**Ubicación del hook:**
```
/etc/letsencrypt/renewal-hooks/deploy/emqx-cert-update.sh
```

### 3. Monitoreo Diario

Un script cron se ejecuta **diariamente** para verificar:

- Días restantes del certificado
- Estado del timer de renovación
- Funcionamiento del hook

**Ubicación:**
```
/etc/cron.daily/check-emqx-ssl
```

**Log:**
```
/var/log/emqx-ssl-check.log
```

---

## 📋 Comandos Útiles

### Verificar Estado de Renovación

```bash
# Ver estado del certificado y renovación automática
/usr/local/bin/check-emqx-ssl-expiration.sh
```

Este script muestra:
- Fecha de expiración
- Días restantes
- Estado del timer de certbot
- Estado del hook de renovación

### Prueba de Renovación (Dry-Run)

```bash
# Simular renovación sin hacer cambios reales
sudo certbot renew --dry-run
```

Esto prueba que:
- Los dominios son accesibles
- Los certificados pueden renovarse
- Los hooks funcionan correctamente

### Ver Logs de Renovación

```bash
# Log de renovaciones de EMQX
cat /var/log/emqx-cert-renewal.log

# Log de verificaciones diarias
cat /var/log/emqx-ssl-check.log

# Log general de Certbot
tail -f /var/log/letsencrypt/letsencrypt.log
```

### Estado del Timer

```bash
# Ver estado
systemctl status certbot.timer

# Ver próxima ejecución
systemctl list-timers certbot.timer

# Ver historial de ejecuciones
journalctl -u certbot.service
```

### Renovar Manualmente (si es necesario)

```bash
# Renovar todos los certificados que lo necesiten
sudo certbot renew

# Forzar renovación de un dominio específico
sudo certbot renew --cert-name iot.lambicall.com --force-renewal
```

**NOTA:** Después de renovación manual, EMQX se reiniciará automáticamente gracias al hook.

---

## 📊 Cronograma de Renovación

| Evento | Cuándo Ocurre |
|--------|---------------|
| Certificado emitido | Dec 6, 2025 |
| Certbot intenta renovar | 30 días antes de expiración (~Feb 4, 2026) |
| Certificado expira | Mar 6, 2026 |
| Timer corre | 2 veces al día (00:00 y 12:00 + delay aleatorio) |
| Monitoreo diario | Todos los días vía cron.daily |

---

## 🔔 Alertas y Notificaciones

### Niveles de Alerta

El script de monitoreo tiene 3 niveles:

1. **✓ NORMAL** (> 30 días)
   - Certificado válido
   - Sin acción necesaria

2. **⚠️ ADVERTENCIA** (7-30 días)
   - Verificar que renovación automática funcione
   - Revisar logs

3. **⚠️ CRÍTICO** (< 7 días)
   - Renovar inmediatamente
   - Verificar qué falló

### Configurar Notificaciones por Email (Opcional)

Edita `/etc/cron.daily/check-emqx-ssl` y descomenta las líneas de email:

```bash
sudo nano /etc/cron.daily/check-emqx-ssl
```

Descomentar y configurar:
```bash
if [ $? -eq 2 ]; then
    echo "Certificado SSL de EMQX próximo a expirar" | \
    mail -s "ALERTA: Certificado SSL EMQX" tu-email@example.com
fi
```

**Requisito:** Instalar y configurar un MTA (mailutils):
```bash
sudo apt-get install mailutils
```

---

## 🛠️ Troubleshooting

### Problema: Timer no está activo

```bash
# Verificar estado
systemctl status certbot.timer

# Si no está activo, habilitarlo
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer
```

### Problema: Renovación falla

```bash
# Ver logs detallados
sudo certbot renew --dry-run -v

# Verificar conectividad
curl -I http://iot.lambicall.com/.well-known/acme-challenge/test

# Verificar Apache
sudo apache2ctl configtest
sudo systemctl status apache2
```

### Problema: Hook no se ejecuta

```bash
# Verificar permisos
ls -la /etc/letsencrypt/renewal-hooks/deploy/emqx-cert-update.sh

# Debería ser: -rwxr-xr-x

# Probar hook manualmente
sudo /etc/letsencrypt/renewal-hooks/deploy/emqx-cert-update.sh

# Verificar que EMQX se reinició
sudo systemctl status emqx
```

### Problema: Certificados no se copian a EMQX

```bash
# Verificar que los certificados existen
ls -la /etc/letsencrypt/live/iot.lambicall.com/

# Verificar directorio de EMQX
ls -la /etc/emqx/certs/

# Copiar manualmente si es necesario
sudo cp /etc/letsencrypt/live/iot.lambicall.com/fullchain.pem /etc/emqx/certs/cert.pem
sudo cp /etc/letsencrypt/live/iot.lambicall.com/privkey.pem /etc/emqx/certs/key.pem
sudo cp /etc/letsencrypt/live/iot.lambicall.com/chain.pem /etc/emqx/certs/cacert.pem
sudo chown -R emqx:emqx /etc/emqx/certs
sudo chmod 600 /etc/emqx/certs/*.pem
sudo systemctl restart emqx
```

---

## 📁 Ubicación de Archivos

### Certificados

```
/etc/letsencrypt/live/iot.lambicall.com/
├── fullchain.pem  # Certificado completo
├── privkey.pem    # Clave privada
├── cert.pem       # Certificado del servidor
└── chain.pem      # Cadena de certificados

/etc/emqx/certs/
├── cert.pem       # Copia usada por EMQX
├── key.pem        # Clave privada usada por EMQX
└── cacert.pem     # Cadena usada por EMQX
```

### Scripts y Configuración

```
/usr/local/bin/check-emqx-ssl-expiration.sh
    → Script de monitoreo de expiración

/etc/letsencrypt/renewal-hooks/deploy/emqx-cert-update.sh
    → Hook que actualiza certificados en EMQX

/etc/cron.daily/check-emqx-ssl
    → Cron job para verificación diaria

/usr/lib/systemd/system/certbot.timer
    → Timer de renovación automática

/usr/lib/systemd/system/certbot.service
    → Servicio de renovación
```

### Logs

```
/var/log/emqx-cert-renewal.log
    → Historial de renovaciones de certificados EMQX

/var/log/emqx-ssl-check.log
    → Resultados de verificaciones diarias

/var/log/letsencrypt/letsencrypt.log
    → Log general de Certbot
```

---

## ✅ Checklist de Verificación

Ejecuta estos comandos periódicamente para asegurar que todo funciona:

```bash
# 1. Verificar timer está activo
systemctl is-active certbot.timer
# Debe mostrar: active

# 2. Ver próxima ejecución
systemctl list-timers | grep certbot

# 3. Verificar estado del certificado
/usr/local/bin/check-emqx-ssl-expiration.sh

# 4. Probar renovación (sin hacer cambios)
sudo certbot renew --dry-run

# 5. Verificar EMQX está corriendo
sudo systemctl status emqx

# 6. Probar conexión SSL
timeout 3 openssl s_client -connect iot.lambicall.com:8883 | grep -E "(CN=|verify)"
```

---

## 🎯 Resumen

### ✓ Configuración Completa

- [x] Certbot timer activo (se ejecuta 2 veces al día)
- [x] Hook de renovación configurado
- [x] Certificados se copian automáticamente a EMQX
- [x] EMQX se reinicia automáticamente tras renovación
- [x] Monitoreo diario configurado
- [x] Logs de renovación habilitados
- [x] Prueba de renovación exitosa (dry-run)

### 🔒 Seguridad

- Certificados válidos por 90 días
- Renovación automática cuando falten 30 días
- Verificación diaria del estado
- Logs de todas las operaciones

### 📞 Soporte

Si necesitas ayuda:

1. Revisa los logs mencionados arriba
2. Ejecuta el script de verificación
3. Consulta la documentación de Certbot: https://certbot.eff.org/docs/
4. Comunidad Let's Encrypt: https://community.letsencrypt.org/

---

**La renovación automática está funcionando correctamente. No requiere intervención manual.**

Última verificación: $(date)
