Rotação de credenciais sem downtime na API de assinatura
Rotação de credencial costuma ser adiada por um motivo razoável: ninguém quer descobrir, às três da tarde de uma terça, que trocar o segredo derrubou a integração. Na API da SignDocs Brasil isso é menos arriscado do que parece — o segredo anterior continua aceito por 24 horas depois da troca, então atualizar o cofre e reiniciar os serviços cabe numa janela confortável, e não há nada a revogar no fim. Mas a sobreposição tem limites que vale conhecer antes de precisar deles: ela não existe para todos os tipos de credencial, e não é o instrumento certo quando a suspeita é de vazamento.
O essencial: rotacionar o client_secret é um botão no painel. O segredo novo aparece uma vez, o antigo segue aceito por 24 horas, e ao fim da janela ele para de funcionar sozinho. O client_id não muda. Nada a revogar.
As quatro credenciais, e quando cada uma vence
| Credencial | Onde vive | Cadência mínima | Imediata quando… |
|---|---|---|---|
client_secret (OAuth2) |
Painel → Credenciais | 12 meses | Exposição em log, repositório ou chamado; saída de pessoa-chave |
| Chave privada JWT ES256 | Seu HSM ou cofre | 12 meses | Mesmos casos |
| Segredo de assinatura de webhook | Painel → Webhooks | 12 meses | Endpoint comprometido, dump de log do receptor |
| Certificado mTLS de cliente | Seu emissor interno | Antes de expirar | Comprometimento da chave privada |
A cadência de 12 meses vem da política de uso aceitável. Na prática, o gatilho que mais aciona rotação não é o calendário — é alguém percebendo que o segredo apareceu onde não devia.
A rotação do client_secret, passo a passo
- Rotacione no painel (Credenciais → selecionar → Rotacionar). O novo segredo é exibido uma única vez; o antigo continua aceito.
- Implante o novo segredo no seu cofre e reinicie os serviços que o mantêm em memória.
- Confirme o uso pelo campo Último uso da credencial e pelo Analytics dela — é assim que você sabe que os serviços realmente pegaram o valor novo.
- Não faça nada no fim. O segredo antigo para de funcionar sozinho ao término da janela.
O segredo não é recuperável. Ele é guardado apenas como hash — o painel mostra tenantId, client_id, Base URL, Token URL e escopos, mas nunca o segredo. Perdeu antes de guardar? Não há suporte que recupere; rotacione de novo. Isso vale como propriedade de segurança e como advertência operacional: copie no momento em que ele aparece.
O horário exato do fim da janela vem em previousSecretExpiresAt, na resposta e no e-mail de aviso. Vale registrá-lo: é o prazo real para o seu rollout, e não "amanhã de manhã".
O que a rotação não faz
Esta é a parte que decide se o procedimento resolve o seu problema:
Rotacionar não invalida os tokens de acesso já emitidos. Um token vale os 15 minutos do expires_in dele, tenha sido emitido com o segredo antigo ou com o novo. Ou seja: depois da rotação ainda existe uma janela curta em que chamadas autenticadas com credencial antiga continuam funcionando.
Para uma troca planejada, isso é irrelevante. Para uma suspeita de vazamento, é o ponto inteiro — e a resposta correta é outra:
Pausar, revogar ou kill switch
Três controles com alcances muito diferentes. O erro caro é usar o mais forte por engano:
| Ação | Alcance | Reversível? | Efeito |
|---|---|---|---|
| Pausar credencial | Uma credencial (só sandbox ou só produção) | Sim — mesmo client_id, mesmo segredo |
Nenhum token novo; os existentes passam a receber 503 |
| Revogar credencial | Uma credencial | Não — nem rotacionar é possível depois | Igual à pausa, permanente. Voltar exige credencial nova, com outro client_id |
| Kill switch do tenant | O tenant inteiro — sandbox e produção | Sim | Todas as chamadas /v1 respondem 503 e o endpoint de token recusa |
Regra prática: para parar a integração de produção sem parar o sandbox, pause a credencial de produção. Reserve o kill switch para o incidente que justifique derrubar tudo, e a revogação para credenciais que não devem voltar.
Duas propriedades operacionais dos três controles:
- Propagação de até 60 segundos. A configuração é cacheada por instância, então uma pausa não é instantânea em toda a frota. Num incidente, conte com esse minuto — e não conclua que o controle falhou ao ver uma chamada passar logo depois de acioná-lo.
- Produção exige papel MASTER. Um papel DEVELOPER faz tudo isso em sandbox sem depender de ninguém, mas não toca nas credenciais de produção. Vale conferir quem tem MASTER antes do incidente: descobrir no meio dele que ninguém disponível pode pausar a credencial é uma forma cara de aprender.
O kill switch tem alcances adicionais por método, e um artigo próprio: kill switch e degradação controlada.
As credenciais sem janela de sobreposição
A sobreposição de 24 horas existe apenas para o client_secret. Nos demais modos, a troca vale na hora — e a continuidade tem de ser construída do seu lado.
Chave privada JWT (ES256)
Para quem autentica com Private Key JWT em vez de segredo compartilhado, a atualização substitui o JWKS inteiro e passa a valer imediatamente. O caminho para rotacionar sem downtime é fazer a sobreposição você mesmo:
Com jwksUri isso funciona bem, porque o conjunto de chaves é seu. Com jwksInline não há como manter as duas conviverem pela via natural — planeje a troca para uma janela de baixa atividade.
Segredo de assinatura de webhook
Este é rotacionável pelo painel, na aba Webhooks — mas sem sobreposição: o segredo anterior é invalidado imediatamente, e o cabeçalho de assinatura nunca carrega duas assinaturas ao mesmo tempo.
A consequência prática é que existe uma janela curta em que eventos em trânsito podem falhar a verificação no seu receptor. Duas formas de conviver com isso:
- Rotacione em horário de baixo volume e aceite a janela, confiando na sua política de reprocessamento — eventos que falham verificação devem ser reprocessáveis, não descartados.
- Ou aceite temporariamente os dois segredos no seu verificador durante a troca: valide contra o segredo novo e, em caso de falha, contra o antigo, por um período curto e explicitamente datado no código.
A segunda opção é a que evita perda, desde que a tolerância seja removida depois — uma verificação que aceita dois segredos para sempre é uma verificação enfraquecida. O desenho do receptor está em webhooks em fila: ack rápido e reprocessamento.
Menor privilégio: uma chave por aplicação, ambiente e função
O ganho é o raio de alcance: uma credencial comprometida derruba uma aplicação, não a operação. O vetor clássico é a chave de produção esquecida num commit público, e o que a torna cara não é a exposição em si — é o escopo completo que ela costuma carregar. Uma credencial de leitura vazada é um incidente; a mesma credencial com escopos de escrita é outro tamanho de problema. O mapa de escopos está em por que o seu token falha.
O nome opcional da credencial no painel parece detalhe e não é: seis meses depois, "qual sistema usa esta chave?" é uma pergunta difícil de responder sem ele — e difícil de responder é o que atrasa uma rotação de emergência.
Detecção: o que existe, e o que não existe
Vale ser explícito sobre o limite, porque a expectativa costuma ser maior:
Existe observabilidade: o campo Último uso e o Analytics por credencial (volume, taxa de erro, endpoints mais chamados), os logs de requisição por tenant, e um e-mail para o contato do tenant a cada criação, rotação, pausa e reativação de credencial. Se chegar um desses avisos e ninguém reconhecer a ação, pause a credencial primeiro e investigue depois.
Os dois sinais práticos de uso indevido são um pico de 401 e um Último uso fora da sua janela de operação — uma credencial de job noturno usada às 15h, por exemplo.
Não existe: varredura automática de segredos vazados em repositórios públicos, revogação preventiva automática, nem um fluxo de "rotação de emergência" com autenticação reforçada. Detecção e reação são suas, com as ferramentas acima. Saber disso muda o desenho: se ninguém do seu lado olha o Analytics, ninguém está olhando.
Se suspeitar de exposição
Escreva para security@signdocs.com.br com o client_id afetado, o vetor suspeito (commit, log, chamado, ex-funcionário), a janela de tempo provável e se você já rotacionou. A análise de logs para confirmar uso indevido é feita em conjunto.
E faça a pausa antes de escrever o e-mail. Um minuto de indisponibilidade planejada custa menos que uma hora de acesso indevido.
Um roteiro para a primeira vez
- Rotacione uma credencial de homologação primeiro, só para conhecer o fluxo e o formato do aviso.
- Confirme quem tem MASTER no tenant e se essa pessoa está alcançável fora do horário comercial.
- Separe as credenciais por aplicação e ambiente, se ainda estiverem compartilhadas.
- Nomeie todas no painel.
- Coloque a cadência de 12 meses no calendário — a rotação que não está agendada não acontece.
- Escreva o procedimento de vazamento em uma página: pausar, rotacionar, reativar, e a quem escrever. É um documento que ninguém lê até precisar dele.
Para onde tudo isso acontece na interface, veja o painel de API. Para a passagem de homologação para produção, o checklist de go-live.
Perguntas Frequentes
Como rotaciono o client_secret?
Pelo painel de API, na aba Credenciais: selecione a credencial e clique em Rotacionar. Um segredo novo é gerado e exibido uma única vez — ele é guardado apenas como hash e não pode ser recuperado depois, nem pelo suporte. O client_id não muda: só o segredo.
Por quanto tempo o segredo antigo continua funcionando?
24 horas a partir da rotação. O horário exato vem na resposta e no e-mail de aviso, no campo previousSecretExpiresAt. Passado esse momento, só o segredo novo autentica — automaticamente, sem nenhuma ação sua. Não há o que revogar.
A rotação derruba os tokens já emitidos?
Não, e essa é a principal limitação a entender. Um token de acesso vale os 15 minutos do expires_in independentemente do segredo que o gerou. Se a sua intenção é cortar o acesso imediatamente, rotacionar não faz isso — pause ou revogue a credencial.
E se eu suspeitar de vazamento? 24 horas não é tempo demais?
É, e o procedimento é outro: pause a credencial, rotacione e reative. A pausa recusa qualquer token novo e faz as chamadas com tokens existentes passarem a responder 503, inclusive as feitas com o segredo antigo. A janela de sobreposição serve à troca planejada, não ao incidente.
Qual a diferença entre pausar, revogar e o kill switch?
O alcance. Pausar atinge uma credencial e é reversível — reativar mantém o mesmo client_id e o mesmo segredo. Revogar atinge uma credencial e é definitivo: voltar exige credencial nova, com client_id diferente, e nem rotacionar é possível depois. O kill switch atinge o tenant inteiro, sandbox e produção juntos, e é reversível. Qualquer um dos três leva até 60 segundos para valer em todas as instâncias.
Quem pode rotacionar uma credencial de produção?
Apenas quem tem papel MASTER no tenant. Um papel DEVELOPER mantém autonomia total sobre as credenciais de sandbox — cria, pausa, rotaciona e revoga sem depender de ninguém — mas não mexe nas de produção.
Com que frequência devo rotacionar?
A política de uso aceitável exige no mínimo a cada 12 meses para client_secret, chave privada JWT e segredo de webhook. Fora da cadência, rotacione imediatamente diante de exposição em log, repositório ou chamado, saída de pessoa com acesso, ou mudança de ambiente.
Rotacione antes de precisar rotacionar às pressas
A troca é um botão no painel de API, com 24 horas de sobreposição para atualizar o cofre sem interrupção. Faça a primeira rotação em homologação para conhecer o procedimento antes de aplicá-lo em produção.
Criar credenciais de homologação Fale com o time comercial