# Seguridad y Certificados ## Certificados Digitales ### Requisitos - Certificado cualificado de firma electrónica (eIDAS) - Formato **.p12** o **.pfx** - Contraseña válida ### Validación La API valida: 1. **Existencia del archivo** 2. **Contraseña correcta** 3. **Fechas de validez** (no expirado, no futuror) 4. **Días hasta expiración** ### Almacenamiento ``` Flujo temporal: ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Original │───▶│ /tmp/ │───▶│ /certs/ │ │ (user) │ │ (validado)│ │ (permanente) └─────────────┘ └─────────────┘ └─────────────┘ ``` 1. El usuario envía el certificado original 2. Se guarda temporalmente en `data/certs/tmp/` 3. Se valida 4. Si es válido, se mueve a `data/certs/` 5. Si falla, se borra el temporal ## Cifrado RSA ### Porqué RSA - Las contraseñas de certificados no se envían en texto plano - El cliente cifra la contraseña con la clave pública de la API - Solo la API puede descifrarla (tiene la clave privada) ### Proceso ``` 1. API genera par de claves RSA al inicio 2. Cliente pide /api/v1/auth/public-key 3. Cliente cifra password con clave pública 4. Cliente envía cifrada 5. API descifra con clave privada ``` ### Generación de Claves Las claves RSA se generan automáticamente en `./keys/`: - `private.pem`: Clave privada (nunca expuesta) - `public.pem`: Clave pública ## HTTPS **Importante**: En producción, la API debe usar HTTPS. ```yaml # config.yml server: port: 443 cert: ./ssl/server.crt key: ./ssl/server.key ``` ## Variables de Entorno ```bash VERIFACTU_ENV=test # test o production VERIFACTU_CERT_PATH=... # path al certificado ``` ## Rate Limiting No implementado actualmente, pero recomendado para producción. ## Logs Los logs contienen: - Requests recibidos - Errores de validación - Respuestas de AEAT (sin información sensible) No contienen: - Contraseñas - Tokens - Contenido de certificados