VerifactuMidAPI/documentacion/seguridad.md

1.9 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 nativamente (sin scripts externos):

  1. Formato PKCS#12 válido
  2. Contraseña correcta
  3. Fechas de validez (no expirado, no futuro)
  4. Días hasta expiración

Almacenamiento

El certificado se envía como base64 en el JSON de registro:

{
  "cert_name": "mi-cert",
  "cert_file": "BASE64_P12_CONTENT",
  "password_encrypted": "..."
}
  1. El cliente envía el certificado como base64
  2. Se valida el PKCS#12 nativamente en Go
  3. Se guarda en data/certs/<cert_name>.p12
  4. Se genera un token de sesión

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