A AUP exige rotação periódica de credenciais. Este guia detalha como rotacionar cada tipo de chave sem downtime.
| Credencial | Onde vive | Cadência obrigatória | Imediata em caso de... |
|---|---|---|---|
client_secret (OAuth2 client_credentials) |
Painel admin → API Keys | 12 meses | Exposição em log, repo público, ticket; saída de pessoa-chave; mudança ambiental |
| Chave privada JWT ES256 (Private Key JWT) | Seu HSM ou secret manager | 12 meses | Mesmo que client_secret |
| Webhook signing secret | Painel admin → Webhooks | 12 meses | Endpoint comprometido, dump de log do receiver |
| Certificado mTLS de cliente | Seu emissor de certificado interno | Antes da expiração (você define) | Comprometimento da chave privada |
| Certificado ICP-Brasil A1 do tenant (assinatura corporativa, se aplicável) | Painel admin → Configurações → Certificados | 1 ano (validade do A1) | Comprometimento da .pfx; revogação pela AC |
A SignDocs Brasil suporta dois segredos ativos simultâneos para client_secret e webhook secret durante uma janela de overlap. Padrão:
Last-Used no painel deve mostrar uso recente da nova credencial.client_secret OAuth2Painel → API Keys → Selecionar credencial → "Rotacionar"
Recebe um novo client_secret (formato sds_secret_...). Os dois ficam válidos por até 90 dias; você revoga a antiga manualmente quando estiver pronto.
Recomendação: nunca confie no overlap automático para revogação. Sempre revogue explicitamente após confirmar uso da nova.
Para tenants que autenticam com Private Key JWT em vez de client_secret:
openssl ecparam -name prime256v1 -genkey -noout -out new-private.pemopenssl ec -in new-private.pem -pubout -out new-public.pemkid (Key ID) próprio. Atualizar seu serviço para emitir JWT assertions com o novo kid.Painel → Webhooks → Selecionar webhook → "Rotacionar segredo"
Recebe um novo segredo. Por 48 horas, a SignDocs Brasil envia eventos assinados com ambos os segredos (header X-SignDocs-Signature carrega duas assinaturas separadas por vírgula). Seu receiver deve aceitar qualquer uma das duas.
function verifyWebhook(rawBody: string, header: string, secrets: string[]): boolean {
const signatures = header.split(',').map(s => s.trim());
for (const sig of signatures) {
for (const secret of secrets) {
const expected = hmac256(rawBody, secret);
if (timingSafeEqual(sig, expected)) return true;
}
}
return false;
}
Após 48h, o segredo antigo é desativado automaticamente.
Os endpoints mtls-api.signdocs.com.br e mtls-api-hml.signdocs.com.br exigem certificado de cliente. A SignDocs Brasil aceita até 3 cadeias de certificação confiáveis por tenant — então rotação é por adição:
Para tenants que usam um certificado A1 corporativo único para assinar Evidence Packs em nome da empresa:
.pfx no painel admin → Certificados..pfx da máquina onde foi feito o upload.Use chaves separadas por aplicação, ambiente e função:
prod/api-server/client_id ← servidor backend, escopos completos
prod/cron-job/client_id ← job batch, escopos limitados a transactions:read
hml/api-server/client_id ← HML
hml/integration-tests/client_id ← CI, escopos mínimos
Comprometimento de uma só limita o blast radius. Vetor comum: chave de produção em commit publico → atacante exfiltra evidências de meses. Mitigação: keys de menor privilégio + rotação imediata + monitoramento Last-Used no painel.
A SignDocs Brasil monitora algumas heurísticas de comprometimento:
client_secret ou webhook secret SignDocs Brasil aparecer num push público, o painel marca a credencial como comprometida e envia e-mail para administrativo@ do tenant.client_secret errado em sequência. Throttling automático seguido de revogação preventiva, com aviso ao tenant.Em caso de auto-revogação, o painel mostra o motivo e oferece fluxo de "rotação de emergência" — o tenant precisa autenticar com 2FA elevado para gerar novo secret.
security@signdocs.com.br. Inclua:
client_id afetadoA SignDocs Brasil ajuda na análise de logs para confirmar uso indevido. Inclui auditoria documental para Enterprise se exigida.