ProyectoGrupal/VerifactuMidAPI/documentacion/seguridad.md

93 lines
1.9 KiB
Markdown

# 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