FT-CERT-DIGITAL· 1.0.0Integrações
Upload de certificado digital (.pfx/.p12) em integrações
Como anexar/trocar certificado digital A1 (.pfx/.p12) ao criar OU editar integração SOAP/REST. Inclui alerta automático 30/14/7/1d antes do vencimento e badge na UI.
Atualizado em 8/6/2026
Integrações que exigem mTLS — webservices SEFAZ (NF-e, NFC-e, CT-e), bancos europeus, parceiros B2B com client cert — aceitam upload de certificado digital A1 no formato PKCS#12 (.pfx/.p12).
No formulário de criar ou editar integração manual, ao escolher protocolo SOAP ou REST/HTTP:
A1 (arquivo .pfx) é suportado. Quando você seleciona "SEFAZ" no campo Plataforma, o protocolo muda automaticamente pra SOAP (padrão dos webservices NF-e/NFC-e/CT-e) e um aviso lembra de anexar o certificado. A3 (token físico/cartão) não está suportado — token requer driver/middleware no servidor, fora de escopo no SaaS.
A senha NUNCA fica em texto puro — só decifra no momento de abrir conexão TLS.
No card da integração, clique em Editar. A seção de protocolo mostra:
O cron
Dedup via UNIQUE (connection_id, days_bucket) em
Canais (na ordem):
Onde aparece
No formulário de criar ou editar integração manual, ao escolher protocolo SOAP ou REST/HTTP:
- Campo Certificado .pfx/.p12 (mTLS) — upload do arquivo
- Campo Senha do certificado — passphrase do .pfx
A1 (arquivo .pfx) é suportado. Quando você seleciona "SEFAZ" no campo Plataforma, o protocolo muda automaticamente pra SOAP (padrão dos webservices NF-e/NFC-e/CT-e) e um aviso lembra de anexar o certificado. A3 (token físico/cartão) não está suportado — token requer driver/middleware no servidor, fora de escopo no SaaS.
O que acontece no servidor
- Frontend lê o arquivo, converte pra base64 e envia junto com a senha
- Backend chama
parsePkcs12(base64, senha)(libsrc/lib/integrations/certificate.ts, usanode-forge) - Se senha errada ou arquivo inválido, retorna HTTP 400 "Certificado inválido"
- Se válido, extrai metadata: subject, issuer, serial, validade, fingerprint SHA-256
- Criptografa o blob (.pfx em base64) e a senha separadamente com AES-256-GCM (
src/lib/crypto.ts, chave emCREDENTIALS_ENCRYPTION_KEY) - Armazena tudo em
connections.certificates(jsonb)
A senha NUNCA fica em texto puro — só decifra no momento de abrir conexão TLS.
Editar / trocar / remover certificado
No card da integração, clique em Editar. A seção de protocolo mostra:
- O subject e a data de validade do cert atual (badge amarelo se < 30d, vermelho se < 7d ou expirado)
- Botão Remover certificado (apaga o cert sem deletar a integração)
- Campo de upload pra subir um novo .pfx (sobrescreve o anterior na próxima save)
Alerta de vencimento (cron diário)
O cron
/api/cron/cert-expiry-alerts roda diariamente às 07:00 UTC e cria 1 alerta por bucket atravessado:
- 30 dias antes — primeiro warning amarelo
- 14 dias — warning amarelo
- 7 dias — alerta vermelho
- 1 dia — alerta crítico vermelho
- 0 dias — cert expirado, urgent
Dedup via UNIQUE (connection_id, days_bucket) em
cert_expiry_alerts. Quando o cert é renovado (não_after muda), um trigger no DB apaga os alerts antigos automaticamente — buckets resetam.Canais (na ordem):
- Slack se
SLACK_ALERTS_WEBHOOK_URLsetado — bloco com subject + bucket + link pra integração - UI badge na integration-card mostrando "Cert vence em Xd" (sempre visível)
Limitações conhecidas
- Apenas A1 (arquivo). A3 (token físico) requer Lefia Agent on-prem ou Cloud HSM — fora desta versão.
- AS4 e EBICS continuam com PEM texto separado (não unificado nesta versão).
- Validação de cadeia/CRL/OCSP não é feita. Se o emissor revogou o cert, só notará na primeira chamada TLS (erro 4xx do servidor da contraparte).
- O cron de alerta roda 1x/dia. Se o cert vence em < 24h depois da última execução, o alerta sai no próximo ciclo.
Schema SQL
connections.certificates(jsonb): metadata + ciphertexts do client certcert_expiry_alerts(table): dedup de buckets, RLS super_admin select-only- Trigger
connections_cert_expiry_alerts_reset: limpa dedup quando cert renovado
Veja também
pipeline-mensagens-fluxos— fluxos completos de mensagem incluindo o cenário SEFAZ + certpii-redaction-llm— privacidade de dados em payloads enviados pra IAai-toggle-hierarchy— toggle de IA por scope
Histórico de versões
- 1.0.0
Upload de certificado digital A1 (.pfx/.p12) em integrações SOAP/REST. Lib parsePkcs12 com node-forge extrai metadata (subject/issuer/serial/validade/fingerprint). API create-integration valida senha e encripta blob+senha com AES-256-GCM, gravando em connections.certificates jsonb. UI file input + password. Documentado em /security e help (slug=certificado-digital-mtls).
5/6/2026 · new