# 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:

```json
{
  "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.

```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