Comunicação com a SEFAZ via mTLS: certificado A1, SOAP e NFS-e Nacional na prática

Resumo: os webservices da SEFAZ (NF-e, CT-e, MDF-e e Distribuição DF-e) e a API da NFS-e Nacional exigem autenticação mútua (mTLS) com o certificado digital ICP-Brasil da empresa. Na prática, muitos ambientes de hospedagem têm dificuldade com isso, principalmente com arquivos PFX antigos. Uma solução que uso é um proxy mTLS dedicado: ele recebe o envelope da requisição, monta a conexão com o certificado em memória e devolve a resposta da SEFAZ, sem gravar o certificado em disco.

O que é mTLS e por que a SEFAZ exige

Em uma conexão HTTPS comum, só o servidor apresenta certificado. No mTLS (mutual TLS), o cliente também se identifica com um certificado digital durante o handshake. É assim que a SEFAZ sabe, antes mesmo de ler o XML, qual empresa está chamando o serviço.

Esse certificado é o e-CNPJ ICP-Brasil da empresa, normalmente do tipo A1, distribuído como arquivo .pfx (PKCS#12) protegido por senha. O mesmo certificado também é usado para assinar digitalmente os XMLs de documentos e eventos. São duas camadas diferentes: o mTLS protege o transporte, a assinatura garante a autoria do documento.

ServiçoFormatoAutenticação
NF-e e NFC-e (autorização, consulta, eventos)SOAP 1.2 sobre HTTPSmTLS com certificado ICP-Brasil
CT-e e MDF-eSOAP 1.2 sobre HTTPSmTLS com certificado ICP-Brasil
Distribuição DF-eSOAP 1.2 sobre HTTPSmTLS com certificado ICP-Brasil
NFS-e NacionalAPI REST com JSONmTLS com certificado ICP-Brasil

Por que um proxy mTLS dedicado

Na teoria, qualquer linguagem consegue fazer uma requisição com certificado de cliente. Na prática, aparecem obstáculos que travam projetos:

  • Hospedagens compartilhadas com pouco controle sobre OpenSSL e bibliotecas de rede.
  • Arquivos PFX antigos gerados com algoritmos legados, que versões recentes do OpenSSL recusam por padrão.
  • Necessidade de gravar certificado e chave em arquivos temporários só para fazer a chamada.
  • Vários sistemas, em linguagens diferentes, repetindo a mesma lógica de conexão.
  • Dificuldade de padronizar tempo limite, logs e tratamento de erro de rede.

O proxy concentra esse problema em um só lugar. Desenvolvi um serviço em Node.js com duas rotas: uma para os webservices SOAP da SEFAZ e outra para a API REST da NFS-e. O sistema de gestão continua montando e assinando o XML; o proxy cuida apenas do transporte com mTLS.

Como o proxy funciona

  1. O sistema envia ao proxy a URL do webservice, o envelope SOAP já montado e o certificado em Base64 com a senha.
  2. O proxy abre o PKCS#12 em memória com uma biblioteca que suporta algoritmos legados.
  3. Extrai a cadeia de certificados e a chave privada no formato PEM, sem gravar nada em disco.
  4. Abre a conexão HTTPS com certificado de cliente e envia o envelope com Content-Type: application/soap+xml.
  5. Aplica um tempo limite de 30 segundos para não prender o sistema em uma conexão travada.
  6. Devolve ao sistema o status HTTP e o corpo da resposta da SEFAZ, sem interpretar o conteúdo fiscal.
POST /sefaz-proxy
{
  "url": "https://<webservice-do-autorizador>/NFeAutorizacao4.asmx",
  "soapEnvelope": "<soap12:Envelope ...>...</soap12:Envelope>",
  "pfxBase64": "<certificado em base64>",
  "pfxPassword": "<senha>"
}

Para a NFS-e Nacional, a rota equivalente recebe o método HTTP, a URL e o corpo JSON. A conexão usa o mesmo princípio: certificado convertido em memória e chamada com mTLS.

O proxy não é um emissor

Ele não monta XML, não assina documento e não decide regras fiscais. Essa separação é proposital: a lógica fiscal fica no sistema de gestão, versionada junto com as regras do negócio, e o proxy permanece pequeno, fácil de auditar e de manter.

Erros mais comuns e como diagnosticar

SintomaCausa provávelO que verificar
Falha no handshake TLSCertificado vencido, revogado ou senha incorretaValidade, senha e se o PFX contém a chave privada
Erro ao abrir o PFXAlgoritmo de proteção legadoBiblioteca com suporte a PKCS#12 antigo ou reexportação do certificado
Rejeição de certificadoCadeia ICP-Brasil incompletaCertificados intermediários no PFX e na cadeia de confiança
Resposta de outro ambienteMistura de homologação e produçãoURL do webservice e o campo de ambiente do XML
Serviço inexistenteAutorizador errado para a UFTabela de webservices do autorizador e serviços de contingência
Consumo indevidoExcesso de consultas repetidasIntervalo entre consultas, principalmente na Distribuição DF-e
Tempo esgotadoInstabilidade do autorizadorRetentativa controlada e contingência quando aplicável

Segurança do certificado

O certificado A1 é, na prática, a identidade digital da empresa. Quem tem o arquivo e a senha consegue assinar documentos em nome dela. Por isso, a arquitetura precisa tratar o certificado como o dado mais sensível do sistema:

  • Armazenar o certificado e a senha criptografados no banco, nunca em texto puro.
  • Manter o proxy em rede interna ou atrás de autenticação e restrição de origem.
  • Usar sempre HTTPS entre o sistema e o proxy.
  • Não registrar certificado, senha nem envelope completo nos logs.
  • Converter o certificado apenas em memória, durante a requisição.
  • Monitorar a data de vencimento e avisar com antecedência.
  • Restringir quem pode cadastrar ou substituir certificados no painel.

Quando essa arquitetura faz sentido

Ela é útil quando a empresa tem um ERP ou sistema próprio que precisa emitir, consultar ou baixar documentos fiscais, quando há vários CNPJs com certificados diferentes, ou quando o ambiente de hospedagem não oferece controle suficiente sobre TLS. É a base de funcionalidades como o módulo DF-e, que consulta documentos emitidos contra o CNPJ da empresa.

Perguntas frequentes

Certificado A3 funciona nesse modelo?

O A3 fica em token ou cartão e não pode ser exportado como arquivo, então não serve para um proxy em servidor. Para integrações automatizadas, o certificado A1 é o formato adequado.

O proxy armazena o certificado?

Não. Na arquitetura que uso, o certificado é armazenado criptografado no sistema de gestão e enviado ao proxy apenas durante a requisição. O proxy converte o arquivo em memória e não grava nada em disco.

Preciso de um proxy se meu servidor já faz mTLS?

Não necessariamente. Se o ambiente controla bem OpenSSL, certificados e tempo limite, a chamada pode ser feita direto. O proxy é útil para padronizar várias aplicações e contornar limitações do ambiente.

A NFS-e também usa certificado?

Sim. A API da NFS-e Nacional usa autenticação mútua com certificado ICP-Brasil. Prefeituras com sistemas próprios podem ter regras diferentes.

Precisa integrar seu sistema à SEFAZ?

Desenvolvo integrações fiscais com mTLS, assinatura de XML, consulta e distribuição de documentos, sempre com certificado protegido, logs e tratamento de erros.