VerifactuMidAPI/documentacion/seguridad.md

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:

  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.

# 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