Como enviar dados fiscais à AEAT com curl usando certificados Redtrust
Visão geral
Este guia explica como enviar informações de IVA e registros de faturas à Agência Estatal de Administração Tributária (AEAT) usando curl, tanto em ambientes Windows quanto Linux. Ele se concentra nos dois principais mecanismos de reporte atualmente utilizados na Espanha:
- Fornecimento Imediato de Informações (SII): para o reporte quase em tempo real dos livros de registro de IVA.
- Veri*Factu: para a transmissão de registros de faturamento verificáveis gerados pelos sistemas de faturamento.
Os exemplos pressupõem que você possui o certificado digital no Redtrust e que sabe qual sistema (SII, Veri*Factu ou ambos) se aplica ao seu caso. Este guia pressupõe familiaridade com HTTPS, certificados e o uso básico da linha de comando.
Contexto
A Espanha está implementando mecanismos de fornecimento de informações tributárias em tempo real ou quase em tempo real para melhorar a rastreabilidade das operações econômicas e reduzir a fraude fiscal. Como parte desse esforço, a AEAT disponibiliza serviços web que aceitam dados estruturados por meio de conexões HTTPS seguras.
Nesse contexto, dois mecanismos complementares são relevantes:
- SII exige que determinados contribuintes enviem os registros de IVA derivados das faturas emitidas e recebidas dentro de prazos reduzidos. Os dados representam informações contábeis e fiscais, não o documento da fatura em si.
- Veri*Factu regula como as faturas são geradas e registradas nos sistemas de faturamento e permite (ou exige, dependendo da configuração) a transmissão dos registros de faturamento à AEAT no momento da emissão.
Do ponto de vista técnico, ambos os sistemas se baseiam em solicitações HTTP autenticadas, utilizam TLS mútuo (autenticação do cliente com um certificado X.509), cargas úteis XML estruturadas (de acordo com o serviço) e endpoints específicos da AEAT.
Como a AEAT expõe esses serviços por meio de protocolos web padrão, você pode interagir com eles usando uma ferramenta genérica como o curl. Este guia se concentra nas solicitações ao SII; os exemplos de Veri*Factu seguem o mesmo padrão.
Antes de começar
- Windows
- Linux
- Agente do Redtrust para Windows
curle Schannel
- Agente do Redtrust para Linux (Ubuntu 22.04 ou 24.04)
curlcompilado com OpenSSL 3p11-kit, para verificar se o módulo PKCS#11 está registradoopensc, que inclui opkcs11-tool
Etapa 1: Verificar os pré-requisitos
- Windows
- Linux
Para que o curl possa usar o repositório de certificados do Windows, o curl deve usar o Schannel.
Execute o comando para verificar se ele está instalado:
curl -V
A resposta deve 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
Verifique a versão do curl e a biblioteca TLS com a qual ele foi compilado:
curl -V
curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3
O curl deve estar compilado com OpenSSL. A versão determina qual componente você instala na etapa 3: nesta resposta é 8.5.0, anterior à 8.12, portanto o engine é o aplicável.
Depois, verifique se o p11-kit reconhece o módulo PKCS#11 do Redtrust:
p11-kit list-modules
A resposta inclui o módulo keyfactor e o 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
O instalador do agente cria esse registro automaticamente.
Se o módulo não aparecer na lista, verifique estas duas causas em ordem.
-
O link de registro não existe, porque você instalou o p11-kit depois do agente. O script de instalação só cria o link se o diretório de módulos já estiver presente. Crie-o manualmente:
sudo ln -s /etc/keyfactor/keyfactor.module /usr/share/p11-kit/modules/keyfactor.module -
O link existe, mas o seu usuário ainda não tem o agente configurado. O módulo precisa da configuração em
~/.keyfactorpara inicializar, e o p11-kit descarta os módulos que não inicializam, portanto o token não aparece. Verifique a configuração comkeyfactor-setup test, sempre semsudo.
Etapa 2: Identificar o certificado
- Windows
- Linux
Você pode encontrar a impressão digital (ou thumbprint) na seção Certificados do console de administração.
Você também pode listar os certificados pela CLI do PowerShell. Para isso, é necessário ter o agente do Windows instalado e que o usuário tenha iniciado sessão.
Get-ChildItem Cert:\CurrentUser\My
Você pode encontrar a impressão digital (ou thumbprint) usando o pkcs11-tool. Use o comando a seguir para listar os certificados atribuídos ao seu usuário:
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 o certificado com o curl, você precisa da URI pkcs11: dele, que identifica o objeto dentro do token. Monte-a com estes três componentes:
pkcs11:token=Redtrust%20for%20Linux;object=ETIQUETA;type=cert
token: o nome do token, sempreRedtrust for Linux.object: a etiqueta do objeto, que é o campolabelda resposta anterior.type:certpara o certificado eprivatepara a chave privada.
As URI pkcs11: são codificadas, portanto substitua cada espaço da etiqueta por %20. A etiqueta D8B6D009411BC734AC9F12858C46EC63C73D959D - Certificate fica assim:
pkcs11:token=Redtrust%20for%20Linux;object=D8B6D009411BC734AC9F12858C46EC63C73D959D%20-%20Certificate;type=cert
Identifique o objeto sempre por object, nunca por id. O módulo retorna os identificadores com preenchimento e o curl não consegue carregar a chave privada quando a URI usa id=.
Etapa 3 (apenas Linux): Habilitar o acesso do curl ao token PKCS#11
O instalador do agente registra o módulo PKCS#11 do Redtrust no p11-kit, portanto você não precisa declarar o caminho da biblioteca no openssl.cnf nem em nenhum outro aplicativo. Você só precisa instalar o componente que o OpenSSL usa para chegar ao p11-kit, que depende da versão do curl que você verificou na etapa 1.
- Versões do
curlanteriores à 8.12: instale o engine PKCS#11 do OpenSSL. curl8.12 ou posterior: instale o provider PKCS#11 do OpenSSL 3.
O Ubuntu 22.04 e o 24.04 distribuem versões do curl anteriores à 8.12, portanto o engine é o método aplicável nessas distribuições.
Para instalar o engine, execute:
sudo apt install -y libengine-pkcs11-openssl
Para instalar o provider, execute:
sudo apt install -y pkcs11-provider
Nos dois casos, o componente descobre o módulo do Redtrust pelo p11-kit por padrão, portanto não há mais nada a configurar.
Os engines do OpenSSL estão obsoletos desde o OpenSSL 3 e o provider é o substituto oficial deles. Mesmo assim, o curl não aceita URI pkcs11: por meio de providers antes da versão 8.12, portanto o engine continua necessário nas versões anteriores.
Etapa 4: Enviar as informações do SII com curl
- Windows
- Linux
Depois de identificar o certificado (D8B6D009411BC734AC9F12858C46EC63C73D959D neste exemplo), você pode usar o comando a seguir para enviar as informações. Substitua CAMINHO pelo caminho até o arquivo XML que você quer enviar.
curl --connect-timeout 60 -m 60 -s -S -L --header "Content-Type: text/xml;charset=UTF-8" --cert "CurrentUser\My\D8B6D009411BC734AC9F12858C46EC63C73D959D" --data-binary "@CAMINHO\invoice.xml" "https://prewww1.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
Observe que este exemplo usa a URL de pré-produção da AEAT. Para produção, mantenha o mesmo caminho e utilize o host de produção (https://www1.agenciatributaria.gob.es). Para a lista completa dos endpoints de produção (e os WSDLs correspondentes), consulte a página oficial de WSDL de serviços web da AEAT.
Este comando usa o certificado para autenticação e a operação correspondente é registrada como um evento no Redtrust.
Depois de identificar o certificado (D8B6D009411BC734AC9F12858C46EC63C73D959D neste exemplo), você pode usar o comando a seguir para enviar as informações. Substitua CAMINHO pelo caminho até o arquivo XML que você quer 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 "@CAMINHO/invoice.xml" \
"https://prewww1.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
Se você instalou o provider em vez do engine, porque a sua versão do curl é 8.12 ou posterior, omita as opções --engine, --cert-type e --key-type. O resto do comando não muda, porque o curl carrega o provider automaticamente ao receber uma 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 "@CAMINHO/invoice.xml" \
"https://prewww1.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
Observe que este exemplo usa a URL de pré-produção da AEAT. Para produção, mantenha o mesmo caminho e utilize o host de produção (https://www1.agenciatributaria.gob.es). Para a lista completa dos endpoints de produção (e os WSDLs correspondentes), consulte a página oficial de WSDL de serviços web da AEAT.
Este comando usa o certificado para autenticação e a operação correspondente é registrada como um evento no Redtrust. A chave privada nunca sai do Redtrust, porque o agente realiza a assinatura do handshake TLS no servidor.
Resumo
Você enviou dados fiscais à AEAT com o curl, autenticando a conexão com um certificado que permanece no Redtrust. No Windows, o curl obtém o certificado do repositório do sistema por meio do Schannel. No Linux, ele obtém do token PKCS#11 do agente por meio do p11-kit, com o engine ou o provider do OpenSSL conforme a versão do curl. Nos dois casos, a chave privada nunca sai do Redtrust e cada uso fica registrado como um evento.
Próximas etapas
- Instalação e configuração do agente no Linux — Configure o agente e cadastre mais usuários do sistema.
- Configurar autenticação SSH baseada em chaves — Use o mesmo módulo PKCS#11 para autenticar por SSH.
- Assinatura desassistida com AutoFirma — Assine documentos com os certificados do Redtrust sem intervenção do usuário.
Esta página foi útil?