VerifactuMidAPI/documentacion/certificado_pruebas.md

121 lines
3.6 KiB
Markdown

# Certificado Digital para VeriFactu
## Introducción
VeriFactu requiere autenticación mTLS: la API presenta tu certificado al conectarse con la AEAT. Tanto en pruebas como en producción se usa el mismo certificado real — no existe un certificado especial de pruebas.
## Certificado válido: FNMT Persona Física
El **Certificado de Ciudadano (Persona Física) de la FNMT** es gratuito y válido tanto para el entorno de pruebas como para producción.
**Obtención gratuita — opciones:**
1. **Presencial en oficina AEAT** (recomendado): llevar el DNI a cualquier delegación de la Agencia Tributaria. Trámite en 2 minutos, sin cita previa en la mayoría.
2. **Con DNIe + NFC**: si tu DNI es posterior a 2015, puedes hacer todo el proceso online desde `sede.fnmt.gob.es` usando el chip NFC del DNI con tu móvil o un lector de tarjetas.
3. **Videollamada** (coste 2,99 € + IVA): servicio de identificación remota sin desplazamiento.
> La renovación online es gratuita mientras el certificado esté vigente (hasta 60 días antes de su vencimiento).
## Verificar el certificado (PowerShell)
```powershell
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2(".\data\certs\personal.p12", "TU_CONTRASEÑA")
Write-Host "Válido desde:" $cert.NotBefore
Write-Host "Válido hasta:" $cert.NotAfter
Write-Host "Asunto:" $cert.Subject
Write-Host "Vigente:" ($cert.NotAfter -gt (Get-Date))
```
El campo `Subject` debe contener `OU=CIUDADANOS` (persona física) y el NIF del titular.
## Registrar Nuevo Certificado
Una vez tengas el archivo .p12:
### 1. Copiar a una ubicación segura
```bash
cp micertificado.p12 ./data/certs/
```
### 2. Actualizar config.yml
```yaml
certificates:
storage_path: ./data/certs/
cert_file: ./data/certs/nuevo_cert.p12
cert_password: TU_CONTRASEÑA
```
### 3. Convertir certificado
La API necesita el certificado en formato PEM:
```bash
python convert_cert.py ./data/certs/nuevo_cert.p12 TU_CONTRASEÑA
```
Esto genera:
- `cert_key.pem` (clave privada)
- `cert_cert.pem` (certificado público)
### 4. Reiniciar API
```bash
# Detener API
taskkill /F /IM main.exe
# Iniciar
go run main.go
```
### 5. Probar
```bash
python test_invoice.py
```
## Estructura de Directorios
```
VerifactuMidAPI/
├── data/
│ └── certs/
│ ├── personal.p12 # Tu certificado
│ ├── cert_key.pem # Generado automáticamente
│ └── cert_cert.pem # Generado automáticamente
└── config.yml # Configuración
```
## Problemas Comunes
### "403 Forbidden"
- El certificado no está autorizado en el entorno de pruebas
- O el certificado es de producción y estás en test
### "Certificate expired"
- El certificado ha caducado
- Solicitar uno nuevo
### "Invalid password"
- La contraseña del .p12 es incorrecta
### "tls: failed to find any PEM data"
- Error al convertir el certificado
- Ejecutar `python convert_cert.py` manualmente para ver el error
## Siguientes Pasos
1. Obtener certificado de pruebas FNMT
2. Registrar en la API
3. Probar con `python test_invoice.py`
4. Verificar que devuelve estado "Correcto" (no "Correcto (local)")
## Recursos
- FNMT: https://www.fnmt.es
- Certificados válidos VeriFactu: https://www.sede.fnmt.gob.es/preguntas-frecuentes/certificado-de-representante/-/asset_publisher/eIal9z2VE0Kb/content/certificados-electr%C3%B3nicos-v%C3%A1lidos-para-el-sistema-veri*factu
- Certificado entidad sin personalidad jurídica: https://www.sede.fnmt.gob.es/certificados/certificado-de-representante/entidad-sin-personalidad-juridica
- Portal AEAT Pruebas: https://preportal.aeat.es
- Sede AEAT: https://sede.agenciatributaria.gob.es