Cómo enviar datos fiscales a la AEAT con curl usando Redtrust
Descripción general
Esta guía explica cómo enviar información de IVA y registros de facturas a la Agencia Estatal de Administración Tributaria (AEAT) utilizando curl, tanto desde entornos Windows como Linux. Se centra en los dos principales mecanismos de reporte que se utilizan actualmente en España:
- Suministro Inmediato de Información (SII): Para el reporte casi en tiempo real de los libros de registro de IVA.
- Veri*Factu: Para la transmisión de registros de facturación verificables generados por los sistemas de facturación.
Los ejemplos asumen que dispones del certificado digital en Redtrust y que sabes qué sistema (SII, Veri*Factu o ambos) aplica a tu caso. Esta guía asume familiaridad con HTTPS, certificados y el uso básico de la línea de comandos.
Contexto
España está implantando mecanismos de suministro de información tributaria en tiempo real o casi en tiempo real para mejorar la trazabilidad de las operaciones económicas y reducir el fraude fiscal. Como parte de este esfuerzo, la AEAT proporciona servicios web que aceptan datos estructurados a través de conexiones HTTPS seguras.
En este contexto, son relevantes dos mecanismos complementarios:
- SII exige que determinados contribuyentes envíen los registros del IVA derivados de las facturas emitidas y recibidas en plazos reducidos. Los datos representan información contable y fiscal, no el documento de factura en sí.
- Veri*Factu regula cómo se generan y registran las facturas en los sistemas de facturación y permite (o exige, según la configuración) la transmisión de los registros de facturación a la AEAT en el momento de la emisión.
Desde un punto de vista técnico, ambos sistemas se basan en solicitudes HTTP autenticadas, utilizan TLS mutuo (autenticación de cliente con un certificado X.509), cargas útiles XML estructuradas (según el servicio) y endpoints específicos de la AEAT.
Dado que la AEAT expone estos servicios mediante protocolos web estándar, puedes interactuar con ellos utilizando una herramienta genérica como curl. Esta guía se centra en las solicitudes al SII; los ejemplos de Veri*Factu siguen el mismo patrón.
Antes de empezar
- Windows
- Linux
- Agente de Redtrust para Windows
curly Schannel
- Agente de Redtrust para Linux (Ubuntu 22.04 o 24.04)
curlcompilado con OpenSSL 3p11-kit, para comprobar que el módulo PKCS#11 está registradoopensc, que incluyepkcs11-tool
Paso 1: Comprobar los requisitos previos
- Windows
- Linux
Para que curl pueda utilizar el almacén de certificados de Windows, curl debe usar Schannel.
Ejecuta el comando para comprobar que está instalado:
curl -V
La respuesta debe incluir Schannel.
curl 8.9.1 (Windows) libcurl/8.9.1 Schannel zlib/1.3 WinIDN
Release-Date: 2024-07-31
Protocols: dict file ftp ftps http https imap imaps ipfs ipns mqtt pop3 pop3s smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HSTS HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM SPNEGO SSL SSPI threadsafe Unicode UnixSockets
Comprueba la versión de curl y la biblioteca TLS con la que está compilado:
curl -V
curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3
curl debe estar compilado con OpenSSL. La versión determina qué componente instalas en el paso 3: en esta respuesta es 8.5.0, anterior a 8.12, así que corresponde el engine.
Comprueba después que p11-kit reconoce el módulo PKCS#11 de Redtrust:
p11-kit list-modules
La respuesta incluye el módulo keyfactor y el token Redtrust for Linux.
keyfactor: /usr/lib/libkeyfactorpkcs11.so
library-description: Redtrust PKCS11
library-manufacturer: Evolium
library-version: 3.50
token: Redtrust for Linux
manufacturer: Evolium
model: Linux
El instalador del agente crea este registro automáticamente.
Si el módulo no aparece en la lista, comprueba estas dos causas en orden.
-
El enlace de registro no existe, porque instalaste p11-kit después del agente. El script de instalación solo crea el enlace si el directorio de módulos ya está presente. Créalo a mano:
sudo ln -s /etc/keyfactor/keyfactor.module /usr/share/p11-kit/modules/keyfactor.module -
El enlace existe, pero tu usuario todavía no tiene el agente configurado. El módulo necesita la configuración de
~/.keyfactorpara inicializarse, y p11-kit descarta los módulos que no se inicializan, por lo que el token no aparece. Comprueba la configuración conkeyfactor-setup test, siempre sinsudo.
Paso 2: Identificar el certificado
- Windows
- Linux
Puedes encontrar la huella digital (o thumbprint) en el apartado Certificados de la consola de administración.
También puedes listar los certificados desde la CLI de PowerShell. Para ello, necesitas tener instalado el agente de Windows y que el usuario haya iniciado sesión.
Get-ChildItem Cert:\CurrentUser\My
Puedes encontrar la huella digital (o thumbprint) utilizando pkcs11-tool. Usa el siguiente comando para listar los certificados que tiene asignados tu usuario:
pkcs11-tool --module /usr/lib/libkeyfactorpkcs11.so --list-objects
Using slot 0 with a present token (0x0)
Certificate Object; type = X.509 cert
label: D8B6D009411BC734AC9F12858C46EC63C73D959D - Certificate
subject: DN: C=ES/serialNumber=IDCES-43465515E, GN=JUAN, SN=GARCIA, CN=GARCIA JUAN
ID: d8b6d009411bc734ac9f12858c46ec63c73d959d
Public Key Object; RSA 2048 bits
label: D8B6D009411BC734AC9F12858C46EC63C73D959D - Public key
ID: d8b6d009411bc734ac9f12858c46ec63c73d959d
Usage: encrypt, verify, wrap
Access: none
Private Key Object; RSA
label: D8B6D009411BC734AC9F12858C46EC63C73D959D - Private key
ID: d8b6d009411bc734ac9f12858c46ec63c73d959d
Usage: decrypt, sign, unwrap
Access: sensitive, extractable
Para usar el certificado con curl necesitas su URI pkcs11:, que identifica el objeto dentro del token. Constrúyela con estos tres componentes:
pkcs11:token=Redtrust%20for%20Linux;object=ETIQUETA;type=cert
token: el nombre del token, siempreRedtrust for Linux.object: la etiqueta del objeto, que es el campolabelde la respuesta anterior.type:certpara el certificado yprivatepara la clave privada.
Las URI pkcs11: van codificadas, así que sustituye cada espacio de la etiqueta por %20. La etiqueta D8B6D009411BC734AC9F12858C46EC63C73D959D - Certificate queda así:
pkcs11:token=Redtrust%20for%20Linux;object=D8B6D009411BC734AC9F12858C46EC63C73D959D%20-%20Certificate;type=cert
Identifica el objeto siempre por object, nunca por id. El módulo devuelve los identificadores con relleno y curl no consigue cargar la clave privada cuando la URI usa id=.
Paso 3 (solo Linux): Habilitar el acceso de curl al token PKCS#11
El instalador del agente registra el módulo PKCS#11 de Redtrust en p11-kit, así que no necesitas declarar la ruta de la biblioteca en openssl.cnf ni en ninguna otra aplicación. Solo tienes que instalar el componente con el que OpenSSL llega hasta p11-kit, que depende de la versión de curl que comprobaste en el paso 1.
- Versiones de
curlanteriores a 8.12: Instala el engine PKCS#11 de OpenSSL. curl8.12 o posterior: Instala el provider PKCS#11 de OpenSSL 3.
Ubuntu 22.04 y 24.04 distribuyen versiones de curl anteriores a 8.12, por lo que el engine es el método aplicable en esas distribuciones.
Para instalar el engine, ejecuta:
sudo apt install -y libengine-pkcs11-openssl
Para instalar el provider, ejecuta:
sudo apt install -y pkcs11-provider
En los dos casos el componente descubre el módulo de Redtrust a través de p11-kit por defecto, así que no hay nada más que configurar.
Los engines de OpenSSL están obsoletos desde OpenSSL 3 y el provider es su sustituto oficial. Aun así, curl no admite URI pkcs11: a través de providers hasta la versión 8.12, por lo que el engine sigue siendo necesario en las versiones anteriores.
Paso 4: Enviar la información del SII con curl
- Windows
- Linux
Una vez que hayas identificado el certificado (D8B6D009411BC734AC9F12858C46EC63C73D959D en este ejemplo), puedes utilizar el siguiente comando para enviar la información. Sustituye RUTA por la ruta al archivo XML que quieres enviar.
curl --connect-timeout 60 -m 60 -s -S -L --header "Content-Type: text/xml;charset=UTF-8" --cert "CurrentUser\My\D8B6D009411BC734AC9F12858C46EC63C73D959D" --data-binary "@RUTA\invoice.xml" "https://prewww1.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
Ten en cuenta que este ejemplo utiliza la URL de preproducción de la AEAT. Para producción, mantén la misma ruta y cambia al host de producción (https://www1.agenciatributaria.gob.es). Para consultar la lista completa de endpoints de producción (y los WSDL correspondientes), consulta la página oficial de WSDL de servicios web de la AEAT.
Este comando utiliza el certificado para la autenticación y la operación correspondiente se registra como un evento en Redtrust.
Una vez que hayas identificado el certificado (D8B6D009411BC734AC9F12858C46EC63C73D959D en este ejemplo), puedes utilizar el siguiente comando para enviar la información. Sustituye RUTA por la ruta al archivo XML que quieres enviar.
curl --engine pkcs11 --cert-type ENG --key-type ENG \
--cert "pkcs11:token=Redtrust%20for%20Linux;object=D8B6D009411BC734AC9F12858C46EC63C73D959D%20-%20Certificate;type=cert" \
--key "pkcs11:token=Redtrust%20for%20Linux;object=D8B6D009411BC734AC9F12858C46EC63C73D959D%20-%20Private%20key;type=private" \
--header "Content-Type: text/xml;charset=UTF-8" \
--data-binary "@RUTA/invoice.xml" \
"https://prewww1.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
Si instalaste el provider en lugar del engine, porque tu versión de curl es 8.12 o posterior, omite las opciones --engine, --cert-type y --key-type. El resto del comando no cambia, porque curl carga el provider automáticamente al recibir una URI pkcs11:.
curl --cert "pkcs11:token=Redtrust%20for%20Linux;object=D8B6D009411BC734AC9F12858C46EC63C73D959D%20-%20Certificate;type=cert" \
--key "pkcs11:token=Redtrust%20for%20Linux;object=D8B6D009411BC734AC9F12858C46EC63C73D959D%20-%20Private%20key;type=private" \
--header "Content-Type: text/xml;charset=UTF-8" \
--data-binary "@RUTA/invoice.xml" \
"https://prewww1.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
Ten en cuenta que este ejemplo utiliza la URL de preproducción de la AEAT. Para producción, mantén la misma ruta y cambia al host de producción (https://www1.agenciatributaria.gob.es). Para consultar la lista completa de endpoints de producción (y los WSDL correspondientes), consulta la página oficial de WSDL de servicios web de la AEAT.
Este comando utiliza el certificado para la autenticación y la operación correspondiente se registra como un evento en Redtrust. La clave privada nunca sale de Redtrust, porque el agente realiza la firma del handshake TLS contra el servidor.
Resumen
Has enviado datos fiscales a la AEAT con curl autenticando la conexión con un certificado que permanece en Redtrust. En Windows, curl obtiene el certificado del almacén del sistema mediante Schannel. En Linux lo obtiene del token PKCS#11 del agente a través de p11-kit, con el engine o el provider de OpenSSL según la versión de curl. En los dos casos la clave privada nunca sale de Redtrust y cada uso queda registrado como un evento.
Próximos pasos
- Instalación y configuración del agente en Linux — Configura el agente y da de alta a más usuarios del sistema.
- Configurar autenticación SSH basada en claves — Usa el mismo módulo PKCS#11 para autenticarte por SSH.
- Firma desatendida de documentos con AutoFirma — Firma documentos sin intervención del usuario con los certificados de Redtrust.
¿Te ha resultado útil esta página?