Segurança

As defesas de cada camada.

CamadaMecanismo
Certificado A1pass (local) ou blob AES-256-GCM com .pfx + senha selados juntos (Fly); decifrado só na memória; mensagens de erro nunca carregam senha nem bytes do certificado
Chave do cofreNFSE_CERT_KEY só em secret do Fly e em pass bassi/nfse/cert-vault-key. Perder a chave = certificados selados ilegíveis (cada conta reenvia o .pfx)
LoginSenha ou passkey (WebAuthn); sessão de 1 dia em memória (reiniciar desloga)
CadastroPainel público exige NFSE_SIGNUP_EMAILS: o processo recusa subir com NFSE_PUBLIC_HOST sem a lista
FormuláriosToken CSRF aleatório por processo em todo POST
HostPedido com Host diferente do configurado recebe 403 — por isso nfse-digital.fly.dev responde 403 e o health check do Fly manda Host: nfse.bassi.engineer
Tokens MCPPrefixo nf_, 256 bits, banco guarda só o SHA-256; revogáveis no painel; erro não diz se o token não existe ou foi revogado
ProduçãoGuarda única para emitir, reenviar, cancelar e agendar (seção 4)
Corpo MCPTamanho limitado, para um token vazado não encher a memória do painel
API RESTMesmo token do MCP, preso à conta; mesmo filtro de Host; corpo limitado a 64 KB; campo desconhecido recusado (400); erro sempre em JSON, sem detalhe interno
Senha de app do GmailTestada com login antes de gravar; selada com AES-256-GCM (dado autenticado = conta + propósito); nunca volta para a tela; o cliente SMTP só manda a senha sobre TLS
E-mailQuebra de linha no assunto ou no nome do remetente é recusada (injeção de cabeçalho); destinatários só como endereço puro
Documentação da APIScalar vendorizado no binário (sem CDN); CSP da página só aceita script do próprio host; telemetria, "Ask AI" e barra de desenvolvedor desligados