# Renovación de Certificados SSL para iot.verena.com.ar y n8n.verena.com.ar

## Contexto

**Fecha de implementación**: 12 de Febrero de 2026  
**Dominios**: iot.verena.com.ar, n8n.verena.com.ar  
**Servidor**: Google Cloud  
**DNS**: AWS Route53  

### Problema Original
- n8n.verena.com.ar está en Docker y usa el puerto 80
- iot.verena.com.ar está instalado directamente (no en Docker)
- Conflicto: Ambos necesitan el puerto 80 para la renovación HTTP-01 de Let's Encrypt
- Solución: Usar validación DNS-01 con Route53 en lugar de HTTP-01

## Configuración Inicial (Una sola vez)

### 1. Usuario IAM en AWS
Se creó el usuario `route53-certbot-user` con los siguientes permisos:

**Políticas adjuntas:**
- AmazonSESFullAccess (AWS Managed)
- Route53CertbotPolicy (Custom)

**Permisos de Route53CertbotPolicy:**
```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "route53:ListHostedZones",
        "route53:ChangeResourceRecordSets",
        "route53:GetChange"
      ],
      "Resource": "*"
    }
  ]
}
```

**Access Key:**
- AccessKeyId: `AKIA3PEOGGOBFZLBCC6N`
- Status: Active
- Región: us-east-1

### 2. Instalación del Plugin en el Servidor

Conectarse por SSH al servidor de Google Cloud:

```bash
# Instalar el plugin de certbot para Route53
sudo apt update
sudo apt install python3-certbot-dns-route53
```

### 3. Configurar Credenciales AWS

```bash
# Crear directorio de configuración AWS
mkdir -p ~/.aws

# Crear archivo de credenciales
nano ~/.aws/credentials
```

Agregar el siguiente contenido:
```ini
[default]
aws_access_key_id = AKIA3PEOGGOBFZLBCC6N
aws_secret_access_key = [SECRET_KEY_GUARDADA]
```

Configurar permisos del archivo:
```bash
chmod 600 ~/.aws/credentials
```

## Proceso de Renovación Manual

### 1. Renovar Certificados

```bash
# Renovar todos los certificados que estén próximos a vencer
sudo certbot renew --dns-route53
```

Salida esperada:
```
The following certificates are not due for renewal yet:
  /etc/letsencrypt/live/verena.com.ar/fullchain.pem expires on 2026-08-02 (skipped)
Congratulations, all renewals succeeded:
  /etc/letsencrypt/live/iot.verena.com.ar/fullchain.pem (success)
  /etc/letsencrypt/live/n8n.verena.com.ar/fullchain.pem (success)
```

### 2. Reiniciar Contenedor Nginx

El puerto 443 es manejado por el contenedor `n8n-nginx` que actúa como reverse proxy:

```bash
# Listar contenedores activos
docker ps

# Reiniciar el contenedor nginx
docker restart n8n-nginx
```

### 3. Verificar el Nuevo Certificado

```bash
# Verificar fechas de validez del certificado
echo | openssl s_client -servername iot.verena.com.ar -connect iot.verena.com.ar:443 2>/dev/null | openssl x509 -noout -dates
```

Salida esperada:
```
notBefore=May  4 13:58:56 2026 GMT
notAfter=Aug  2 13:58:55 2026 GMT
```

## Renovación Automática

### Configurar Cron Job

```bash
# Editar crontab
sudo crontab -e
```

Agregar la siguiente línea para renovar el día 1 de cada mes a las 3 AM:
```bash
0 3 1 * * certbot renew --dns-route53 --quiet && docker restart n8n-nginx
```

Verificar que se agregó correctamente:
```bash
sudo crontab -l
```

## Arquitectura del Sistema

```
┌─────────────────────────────────────────┐
│     Google Cloud Server                 │
│                                         │
│  ┌───────────────────────────────────┐ │
│  │  Docker Container: n8n-nginx      │ │
│  │  - Puertos: 80, 443               │ │
│  │  - Reverse Proxy                  │ │
│  │  - Certificados SSL               │ │
│  └───────────────────────────────────┘ │
│           │                             │
│           ├─► n8n.verena.com.ar        │
│           └─► iot.verena.com.ar        │
│                                         │
└─────────────────────────────────────────┘
                  │
                  ▼
         ┌────────────────┐
         │  AWS Route53   │
         │  DNS Records   │
         └────────────────┘
```

## Comandos de Diagnóstico

### Verificar qué proceso usa el puerto 443
```bash
sudo netstat -tlnp | grep :443
sudo ss -tlnp | grep :443
```

### Listar contenedores Docker
```bash
docker ps
```

### Ver logs del contenedor nginx
```bash
docker logs n8n-nginx
```

### Verificar estado de certbot
```bash
sudo certbot certificates
```

### Probar renovación sin ejecutar
```bash
sudo certbot renew --dns-route53 --dry-run
```

## Notas Importantes

1. **Método de validación**: Se usa DNS-01 en lugar de HTTP-01 para evitar conflictos de puerto
2. **Certificados Let's Encrypt**: Válidos por 90 días
3. **Renovación recomendada**: 30 días antes del vencimiento
4. **Zona DNS**: verena.com.ar (Hosted Zone ID: Z12BWOOAQKU0B5)
5. **IP del servidor**: 35.247.220.115 (Google Cloud)

## Troubleshooting

### Error: "Plugin not found"
```bash
sudo apt install python3-certbot-dns-route53
```

### Error: "Unable to locate credentials"
Verificar que el archivo `~/.aws/credentials` existe y tiene los permisos correctos (600)

### Error: "Invalid credentials"
Verificar que la Access Key y Secret Key sean correctas y que el usuario IAM tenga los permisos necesarios

### Certificado no se aplica después de renovar
```bash
docker restart n8n-nginx
```

## Referencias

- **Perfil AWS**: xgestion
- **Región AWS**: us-east-1
- **Usuario IAM**: route53-certbot-user
- **Hosted Zone**: Z12BWOOAQKU0B5 (verena.com.ar)
- **Documentación Certbot**: https://certbot.eff.org/
- **Plugin Route53**: https://certbot-dns-route53.readthedocs.io/

---

**Última actualización**: Mayo 4, 2026  
**Próxima renovación**: Agosto 2, 2026
