Cómo enviar datos fiscales a la AEAT con curl usando Redtrust
Visió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)
pkcs11-toolcurlversión > 8.17.0 y OpenSSL versión > 3.0.12
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 salida 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
Para comprobar los requisitos previos, ejecuta:
curl -V
La salida mostrará la versión instalada de curl.
curl 8.17.0 (x86_64-pc-linux-gnu) libcurl/8.17.0 OpenSSL/3.0.12
Paso 2: Localizar la huella digital del 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 disponibles para el usuario que ha iniciado sesión.
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
Paso 3 (solo Linux): Configurar OpenSSL para usar el engine PKCS#11 de Redtrust
-
Localiza el archivo de configuración de OpenSSL en
/etc/ssl/openssl.cnf. -
Crea una copia del archivo, por ejemplo en tu directorio personal.
cp /etc/ssl/openssl.cnf $HOME/openssl-redtrust.cnf -
Edita el archivo de configuración copiado y añade las siguientes secciones para habilitar el engine framework de OpenSSL.
openssl_conf = openssl_init
[openssl_init]
engines = engine_section
[engine_section]
redtrust = redtrust_engine
[redtrust_engine]
engine_id = redtrust
# Ruta al engine PKCS#11 de OpenSSL (pkcs11.so).
# Ejemplos:
# - /usr/lib/x86_64-linux-gnu/engines-3/pkcs11.so
# - /usr/lib64/engines-3/pkcs11.so
dynamic_path = OPENSSL_ENGINES_DIR/pkcs11.so
# Ruta al módulo PKCS#11 de Redtrust (libkeyfactorpkcs11.so).
# Ejemplos:
# - /usr/lib/libkeyfactorpkcs11.so
# - /usr/local/lib/libkeyfactorpkcs11.so
MODULE_PATH = REDTRUST_PKCS11_MODULE_PATH/libkeyfactorpkcs11.so
init = 1Al añadir las secciones
openssl_confyengines, indicas a OpenSSL que cargue engines criptográficos externos durante el arranque.tipPuedes localizar el módulo PKCS#11 de Redtrust con
sudo find /usr /lib /opt -name "libkeyfactorpkcs11.so" 2>/dev/nully el engine pkcs11 para OpenSSL 3.x consudo find /usr /lib /opt -path "*engines-3*" -name "pkcs11.so" 2>/dev/null.Si no puedes encontrar este último, es posible que necesites instalar
libp11-3ylibengine-pkcs11-openssl. Para ello, ejecutasudo apt updateysudo apt install -y libp11-3 libengine-pkcs11-openssll. -
Indica a OpenSSL que utilice el archivo de configuración personalizado. Como estás usando un archivo de configuración copiado, debes indicárselo explícitamente a OpenSSL. Define la variable de entorno OPENSSL_CONF:
export OPENSSL_CONF=$HOME/openssl-redtrust.cnf -
Verifica la configuración del engine de Redtrust:
openssl engine -t -c
Si la configuración es correcta, la salida incluye una entrada similar a la siguiente:
(rdrand) Intel RDRAND engine
[RAND]
[ available ]
(dynamic) Dynamic engine loading support
[ unavailable ]
(redtrust) pkcs11 engine
[ available ]
Si el engine aparece como disponible, OpenSSL puede cargar correctamente el engine PKCS#11 de Redtrust y utilizarlo para las operaciones criptográficas necesarias para autenticar el envío de información al SII.
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.
curl --connect-timeout 60 -m 60 -s -S -L --header "Content-Type: text/xml;charset=UTF-8" --cert "CurrentUser\My\D8B6D009411BC734AC9F12858C46EC63C73D959D" --data-binary "@path\file.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.
curl --engine redtrust --key-type ENG \
--cert "redtrust:object=D8B6D009411BC734AC9F12858C46EC63C73D959D - Certificate;type=cert" \
--key "redtrust:object=D8B6D009411BC734AC9F12858C46EC63C73D959D - Private key;type=private" \
--header "Content-Type: text/xml;charset=UTF-8" --data-binary "@$HOME/path-to-file/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.