Saltar al contenido principal
Versión: 4.40

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

  • Agente de Redtrust para Windows
  • curl y Schannel

Paso 1: Comprobar los requisitos previos

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

Paso 2: Localizar la huella digital del certificado

Puedes encontrar la huella digital (o thumbprint) en el apartado Certificados de la consola de administración.

info

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

Paso 3 (solo Linux): Configurar OpenSSL para usar el engine PKCS#11 de Redtrust

  1. Localiza el archivo de configuración de OpenSSL en /etc/ssl/openssl.cnf.

  2. Crea una copia del archivo, por ejemplo en tu directorio personal.

    cp /etc/ssl/openssl.cnf $HOME/openssl-redtrust.cnf
  3. 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 = 1

    Al añadir las secciones openssl_conf y engines, indicas a OpenSSL que cargue engines criptográficos externos durante el arranque.

    tip

    Puedes localizar el módulo PKCS#11 de Redtrust con sudo find /usr /lib /opt -name "libkeyfactorpkcs11.so" 2>/dev/null y el engine pkcs11 para OpenSSL 3.x con sudo 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-3 y libengine-pkcs11-openssl. Para ello, ejecuta sudo apt update y sudo apt install -y libp11-3 libengine-pkcs11-openssll.

  4. 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
  5. 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

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"
nota

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.