3.6 KiB
3.6 KiB
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:
- 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.
- Con DNIe + NFC: si tu DNI es posterior a 2015, puedes hacer todo el proceso online desde
sede.fnmt.gob.esusando el chip NFC del DNI con tu móvil o un lector de tarjetas. - 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)
$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
cp micertificado.p12 ./data/certs/
2. Actualizar config.yml
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:
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
# Detener API
taskkill /F /IM main.exe
# Iniciar
go run main.go
5. Probar
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.pymanualmente para ver el error
Siguientes Pasos
- Obtener certificado de pruebas FNMT
- Registrar en la API
- Probar con
python test_invoice.py - 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