2.1 KiB
2.1 KiB
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:
- Existencia del archivo
- Contraseña correcta
- Fechas de validez (no expirado, no futuror)
- Días hasta expiración
Almacenamiento
Flujo temporal:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Original │───▶│ /tmp/ │───▶│ /certs/ │
│ (user) │ │ (validado)│ │ (permanente)
└─────────────┘ └─────────────┘ └─────────────┘
- El usuario envía el certificado original
- Se guarda temporalmente en
data/certs/tmp/ - Se valida
- Si es válido, se mueve a
data/certs/ - 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.
# config.yml
server:
port: 443
cert: ./ssl/server.crt
key: ./ssl/server.key
Variables de Entorno
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