92 lines
2.1 KiB
Markdown
92 lines
2.1 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:
|
|
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.
|
|
|
|
```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 |