"JEFE, ESO NO SE REGALA": 2 cosas que todo el mundo acaba no programando: login con certificado digital y verificación de NIF+nombre con AEAT

En Iberfácil trabajamos a diario con identidad digital, certificados, administraciones públicas y datos que tienen que ser correctos. Y hay dos problemas que cualquiera que haga software en España acaba teniendo delante.

2 paquetes PHP gratis: login con certificado digital y verificación de NIF con la AEAT

En Iberfácil trabajamos a diario con identidad digital, certificados, administraciones públicas y datos que tienen que ser correctos. Y hay dos problemas que cualquiera que haga software en España acaba teniendo delante.

¿Cómo dejo que alguien entre en mi aplicación con su certificado digital en vez de con una contraseña?

¿Cómo compruebo automáticamente que el NIF y el nombre que me da un cliente son los que constan en la Agencia Tributaria?

Nosotros necesitábamos resolverlos, y lo hicimos. La solución la hemos publicado para que cualquiera los use.

Hemos liberado eidas-cert-auth y es-aeat-vnif: uno para que la gente entre en tu aplicación con su certificado digital validado contra las listas de confianza de la UE, y otro para preguntarle a la Agencia Tributaria si un NIF y un nombre van juntos. Licencia MIT, sin API nuestra por medio, sin cuota, sin letra pequeña.


Llevaba meses sin tocar código de verdad.

Reuniones, presupuestos, contratos, nóminas, clientes, proveedores, más reuniones. Lo normal cuando montas una empresa: acabas siendo más administrativo que otra cosa. Abres el editor un martes por la tarde, te llaman por teléfono, y lo cierras tres semanas después.

Este año nos tocaron dos problemas que llevábamos tiempo esquivando, y decidí que esos dos los hacía yo. No por nostalgia. Bueno, un poco sí.

Y cuando dije que además los íbamos a publicar en abierto, la reacción en casa fue más o menos:

"MARCO, ESTO NOS HA COSTADO SEMANAS. ¿ENSERIO LO VAS A REGALAR?"

Sí. Y te cuento por qué al final del artículo. Primero, qué son.


LOS DOS PROBLEMAS QUE ACABA TENIENDO DELANTE CUALQUIER DESARROLLADOR DE APLICACIONES WEB PARA EMPRESAS ESPAÑOLAS

  1. UNO: saber quién entra. Las contraseñas se olvidan, se reutilizan y se roban. Cuando una gestoría, un despacho o una administración abre un área privada, necesita saber si quien entra es el cliente, alguien que actúa en nombre de una empresa, o alguien que intenta suplantarlos. Un nombre y un NIF escritos en un formulario no demuestran nada. El certificado digital sí sirve para eso. El problema es que validarlo bien lleva muchísimo más trabajo del que parece: cadena de confianza, listas de confianza europeas firmadas, revocación, perfiles distintos según la operación… Casi todo el mundo acaba haciendo una versión a medias que "funciona".

  2. DOS: saber si ese NIF es de quien dicen, y si esos datos son correctos. Los datos de un cliente o un proveedor llegan escritos a mano, copiados de un correo o dictados por teléfono. Antes de facturar, dar de alta a alguien o meterlo en una informativa, conviene saber que ese NIF existe y que corresponde a ese nombre, y que ese nombre es correcto, está completo y bien escrito. Si no, el error no aparece hoy: aparece en el 347 o en el SII, cuando ya no puedes hacer nada bonito al respecto.

Los resolvimos para nosotros. Y los hemos publicado los dos con licencia MIT.

Antes de nada, una aclaración que ahorra confusiones: son dos cosas distintas y no dependen la una de la otra. Una autentica (quién está entrando). La otra verifica (si ese NIF y ese nombre existen juntos en el censo). Puedes usar solo una, o las dos.


EIDAS-CERT-AUTH: AUTENTICACIÓN CON CERTIFICADO DIGITAL

Autenticación con certificado digital en PHP, validado contra las listas de confianza de la UE

En lenguaje llano. Permite que la gente entre en tu web o aplicación con su certificado digital: FNMT, DNIe o de prestadores cualificados de otros países de la UE. Y no se limita a leerlo:

  • Consulta la lista oficial de confianza de la UE, firmada, para saber qué autoridades y prestadores se aceptan.

  • Comprueba que el certificado está vigente, que su cadena llega a una autoridad admitida y que sirve para la operación que se pide.

  • Consulta si está revocado. Y si no puede comprobarlo, rechaza el acceso por defecto. Esto último parece un detalle y es media biblioteca.

  • Extrae los datos del certificado: nombre, NIF o identificador equivalente y, cuando consta, la representación de una empresa.

Lo que no hace: no ejecuta una firma electrónica y no decide permisos. Tu aplicación sigue decidiendo a qué cuenta corresponde una identidad y si una representación declarada basta para el trámite concreto.

El detalle técnico. PHP 8.2 o superior con curl, dom, libxml y openssl, más el ejecutable openssl. El núcleo no depende de ningún framework; trae línea de comandos y un adaptador opcional para Laravel.

composer require iberfacil/eidas-cert-auth

Las listas de confianza se descargan y verifican automáticamente a un almacén privado. Por defecto solo se acepta España (ES); los demás países se añaden con "countries".

vendor/bin/eidas-cert-auth trust-list:update --store=/path/to/private-data/trust --region=ES --dry-run
vendor/bin/eidas-cert-auth trust-list:update --store=/path/to/private-data/trust --region=ES
vendor/bin/eidas-cert-auth doctor --store=/path/to/private-data/trust

Validar un certificado sin Laravel, una vez construido el validador:

$resultado = $validator->validate($pemDeVariableServidor);
if (! $resultado->valid) {
    // Use $resultado->reason; no registre el PEM ni la identidad por defecto.
}

Y en Laravel, con un perfil por ruta:

Route::post('/firmar', $handler)->middleware('eidas.cert:signature');
Repositorio marxgavilan/eu-eidas-cert-auth en GitHub

ES-AEAT-VNIF: VERIFICAR NIF Y NOMBRE COMPLETO CONTRA LA AEAT: PERSONAS FÍSICAS Y JURÍDICAS

En lenguaje llano. La Agencia Tributaria ofrece un servicio de verificación de NIF de terceros (VNifV2). Este paquete lo consulta por ti: le das un NIF y un nombre o razón social, y te dice si el NIF existe y corresponde a ese nombre, cuál es el nombre exacto del censo cuando el tuyo es aproximado o solo se parece, y si figura dado de baja o revocado. De uno en uno o por lotes.

Necesitas tu propio certificado electrónico —de persona física, de representante de persona jurídica o de sello de entidad— en .p12 o .pfx. La consulta va de tu servidor a la AEAT, con tu identidad: úsalo solo para tus clientes, proveedores y trámites.

Lo que no hace: no acredita que la persona que te da los datos sea quien dice ser. Solo confirma que ese NIF y ese nombre existen juntos en el censo. (Para lo otro, el paquete de arriba.)

El detalle técnico.

composer require iberfacil/es-aeat-vnif
vendor/bin/aeat-vnif doctor
vendor/bin/aeat-vnif check 00000000T --nombre=Zefira --apellido1=Lumina --apellido2=Peralvillo
vendor/bin/aeat-vnif batch clientes.csv

El CSV va separado por ;, una línea por contribuyente. Desde código:

use Iberfacil\AeatVnif\VnifClient;
use Iberfacil\AeatVnif\Data\TaxpayerName;
$client = VnifClient::create('/etc/aeat/certificado.p12', getenv('AEAT_VNIF_CERT_PASSWORD'));
$result = $client->check('00000000T', TaxpayerName::naturalPerson('Zefira', 'Lumina', 'Peralvillo'));
$result->isIdentified();  // true
$result->censusName;      // 'LUMINÁ PERALVILLO ZÉFIRA' (como figura en el censo)

El servicio admite hasta 10.000 contribuyentes por petición y el paquete trocea los lotes solo.

Las respuestas se casan por NIF, nunca por nombre, y un «NO PROCESADO» no tumba el lote: queda marcado para reintentarlo. Hay adaptador para Laravel con fachada, comandos Artisan, eventos y caché opcional. La contraseña va siempre en el entorno, nunca en el código, y el paquete no registra nada por su cuenta: tú decides qué se audita.

Repositorio marxgavilan/es-aeat-vnif en GitHub

¿PARA QUIÉN ES?

Pues, en realidad, todo tipo de entidades, desde la PYME más pequeña hasta la Empresa más grande, pueden beneficiarse de estos paquetes. Poder comprobar que un nombre y apellidos y un DNI coinciden, están correctamente escritos, y completos tal como figura en el censo de la AEAT, y facilitar que los clientes, empleados y colaboradores puedan identificarse con certificado digital en sus aplicaciones corporativas, son funciones útiles prácticamente para cualquiera. Sin embargo, existen algunas entidades que, por su naturaleza, pueden beneficiarse especialmente:

  • Gestorías y asesorías: que los clientes entren en su área privada con certificado, y revisar un fichero de altas nuevas antes de darlas de alta de verdad.

  • Despachos: distinguir a la persona física de quien actúa como representante de una empresa, y obtener el nombre exacto tal como consta en la AEAT.

  • Facturación y administración: evitar facturas con un NIF inexistente o una razón social que no corresponde.

  • Compliance y alta de proveedores: comprobar que el CIF y la razón social van juntos, y conservar la evidencia de la comprobación.

  • Plataformas y administraciones: identificar al solicitante de un trámite y exigir un perfil más estricto en las operaciones sensibles.

Y AHORA SÍ.... ¿POR QUÉ LO REGALAMOS?

Vuelvo a la crítica del principio, que era justa.

Nos ha costado trabajo. Y precisamente por eso: si a nosotros nos ha costado esto, a otros les está costando lo mismo, ahora mismo, en otra oficina, resolviendo exactamente el mismo problema por enésima vez en este país. Eso no es ventaja competitiva. Eso es infraestructura, y la infraestructura duplicada mil veces es tiempo tirado a la basura, mil veces.

Nuestro negocio no es cobrar por validar un certificado. Es lo que construimos encima.

Son software libre con licencia MIT: sin API de Iberfácil de por medio, sin cuota y sin tener que contratar nada con nosotros. Tu servidor habla directamente con las listas de confianza de la UE y con la AEAT. Si mañana desaparecemos, tu integración sigue funcionando. Eso también es parte del trato.

Y hay un motivo menos romántico: un código que toca certificados y datos personales tiene que poder revisarse. En abierto lo revisa cualquiera. Si encuentras un fallo en el mío, me estás haciendo un favor, no una crítica.

Creo sinceramente que las empresas españolas podemos aportar muchísimo más código abierto en general. Pero alrededor de la relación con la Administración, la identidad digital y eIDAS, estamos en pañales en lo que al OpenSource se refiere. Nos quejamos mucho de lo difícil que es integrarse con lo público —y a veces con razón— pero después cada uno se guarda su solución en el cajón. Esto es nuestro granito de arena.

Y, siendo honesto: disfruté muchísimo haciéndolo. Tenía olvidado lo que es cerrar un problema de verdad, con tests en verde, en vez de cerrar una reunión. Si eres CEO, CTO o fundador y llevas meses sin picar nada: coge un problema pequeño y hazlo tú. No te vas a arrepentir.


¿CÓMO PUEDES AYUDAR? (Aquí va la parte "egoísta")

Si te ha parecido útil, dale una estrella a los repos. Suena a tontería, pero es lo que hace que el siguiente que tenga este problema a las dos de la mañana lo encuentre en vez de volver a programarlo desde cero.

Las incidencias y los pull requests son bienvenidos. Los dos repositorios explican las reglas en su CONTRIBUTING.md: rama corta desde main, pruebas que no tocan la red y datos siempre inventados, nunca certificados ni datos reales. Si encuentras un problema de seguridad, no abras una incidencia pública: sigue el SECURITY.md de cada repositorio.

Y si trabajas en una gestoría, un despacho, una plataforma o una administración y esto te resuelve algo: pásaselo a tu equipo de desarrollo. O si eres tú quien desarrolla, pásaselo a tu jefe. Son dos composer require y no cuesta nada.

Marco Gavilán
CEO de Iberfácil

29 de septiembre de 2026

Cuéntanos tu caso