Certificado DAT

1. Visão geral

O certificado DAT é a especificação que controla a permissão de emissão do DAT e gerencia os algoritmos de assinatura e de criptografia do token, além das informações de chave (Key).

Cada certificado possui um ID único (CID) e, ao impor a janela de emissão do DAT e o prazo de validade (TTL) dos tokens gerados, gerencia com segurança o ciclo de vida dos tokens.

No DAT, a rotação de chaves não é opcional. Como a janela de emissão está gravada no certificado no nível da especificação, uma vez passado o período não é possível criar novos tokens com aquele certificado.


2. Estrutura do certificado

Formato wire do certificado
cid
uint64 (hexadecimal)
.
start
uint64 (decimal)
.
duration
uint64 (decimal)
.
ttl
uint64 (decimal)
.
sig-alg
String
.
crypto-alg
String
.
sig-key
Base64Url
.
crypto-key
Base64Url
Passe o mouse sobre cada campo para ver a descrição.
cid . start . duration . ttl . sig-alg . crypto-alg . sig-key . crypto-key
Estrutura
Exemplorefresh

2.1. Especificação detalhada por campo

CID : Hex (uint64)

  • É o ID único que identifica o certificado. É mapeado com o campo CID do DAT e determina qual certificado usar na verificação.
  • O CID é um identificador imutável. Ao substituir a chave, não se reutiliza o mesmo CID: emite-se um certificado com um novo CID.

Hora de Início de Emissão do DAT : uint64 (Unix Time)

  • Indica, em segundos (Seconds), o momento de início a partir do qual se pode emitir DAT usando esse certificado.

Duração de Emissão do DAT : uint64 (Seconds)

  • É a janela de validade para emissão do certificado. Depois que esse período (em segundos) transcorre a partir de Hora de Início de Emissão do DAT, não é mais possível emitir novos DATs com esse certificado.
  • É uma duração (duration), não um instante absoluto. O momento de término é calculado como start + duration.

DAT TTL (Tempo de Vida) : uint64 (Seconds)

  • É o prazo de validade (Time To Live) dos DATs emitidos com esse certificado. Ao gerar o DAT, o valor de expire é definido somando esse valor ao momento da emissão.

Algoritmo de Assinatura : String / Enum

  • É o algoritmo de assinatura a ser usado ao gerar e verificar o campo signature do DAT.

Algoritmo de Criptografia : String / Enum

  • É o algoritmo de criptografia a ser usado ao criptografar e descriptografar o campo secure do DAT.

Chave de Assinatura : Base64Url (Binary)

  • É o dado de chave usado na assinatura e na verificação. (Dependendo do algoritmo, pode ser a Public/Private Key de uma chave assimétrica ou uma chave simétrica.)

Chave de Criptografia : Base64Url (Binary)

  • É o dado de chave de criptografia usado na cifragem e na decifragem do campo secure.

2.2. Cálculo de tempo

end    = start + duration        momento de término da emissão
expire = end + ttl               momento de expiração final do certificado
  • Todos os cálculos são feitos em uint64 e apenas o overflow é rejeitado como erro.
  • duration = 0 e ttl = 0 são valores legítimos. É possível representar um certificado cuja janela de emissão fecha imediatamente, ou um certificado que gera tokens que se tornam inválidos assim que expiram.
  • Como todos os campos são inteiros sem sinal, valores negativos não existem no tipo.

2.3. Assinatura do construtor

Todas as implementações de linguagem usam a ordem de argumentos abaixo.

(cid, dat_issuance_start_seconds, dat_issuance_duration_seconds, dat_ttl_seconds,
 signature_key, crypto_key)

O terceiro argumento é uma duração, não o momento de término

Se você passar o momento absoluto de término (end) no terceiro argumento, será criado, sem nenhum erro, um certificado com uma janela de validade completamente equivocada, pois o valor entra diretamente em start + duration.


3. Ciclo de vida do certificado

Os quatro intervalos do certificado
Criação
Início da emissão
Fim da emissão
Expiração final
Atraso de emissão (delay)
Emissão possível (duration)
DAT TTL
Tempo para que todos os nós recebam o certificado
Emissão e verificação de DAT possíveis
Emissão impossível, somente verificação
O certificado só expira definitivamente depois de percorrer os intervalos de atraso de emissão → emissão possível → TTL restante do DAT.
IntervaloEmissãoVerificaçãoCondição
Atraso de emissãoissuable() == false
Emissão possívelissuable() == true
TTL restante do DATJanela de emissão fechada, mas antes da expiração
Após a expiração finalexpired() == true
  • A possibilidade de emissão é determinada por signable() && start <= now <= end, incluindo ambas as extremidades.
  • Mesmo depois que a janela de emissão fecha, o certificado continua vivo por mais ttl. Isso porque um token emitido pouco antes do fechamento da janela precisa poder cumprir toda a sua vida útil.
  • O intervalo de atraso de emissão (delay) existe para dar tempo a que todos os nós do cluster recebam o novo certificado. Para mais detalhes, consulte o documento Sincronização do CMS.

4. Algoritmos

4.1. Algoritmos de assinatura

Lista dos algoritmos de assinatura para prevenir adulteração e falsificação do DAT. São suportados os modos de chave simétrica e de chave assimétrica.

NomeModoObservação
ECDSA-P256assimétricoAssinatura digital de curva elíptica (NIST secp256r1)
ECDSA-P384assimétricoAssinatura digital de curva elíptica (NIST secp384r1)
ECDSA-P521assimétricoAssinatura digital de curva elíptica (NIST secp521r1)
HMAC-SHA256-MFSsimétricoKeyed-Hashing baseado em chave secreta de tamanho fixo de 256 bits
HMAC-SHA384-MFSsimétricoKeyed-Hashing baseado em chave secreta de tamanho fixo de 384 bits
HMAC-SHA512-MFSsimétricoKeyed-Hashing baseado em chave secreta de tamanho fixo de 512 bits

MFS (Maximum Fixed Secret): método que utiliza uma chave secreta de tamanho fixo com o mesmo número de bits do tamanho de saída (Output) do algoritmo de hash.

4.2. Algoritmos de criptografia

Lista dos algoritmos de criptografia autenticada (Authenticated Encryption) para proteger os dados confidenciais internos do DAT (campo secure).

NomeTamanho da chaveEstrutura
IV-AES128-GCM128-bitIV(96bit) + resultado da criptografia
IV-AES256-GCM256-bitIV(96bit) + resultado da criptografia

Incorporação do IV (Initialization Vector): um NONCE (IV) exclusivo de 96 bits, gerado a cada criptografia, é combinado como prefixo (Prefix) antes do resultado da criptografia. Na descriptografia, os primeiros 96 bits são separados como IV para realizar a decifragem.

4.3. Validação do tamanho da chave

Ao importar um certificado, verifica-se se o número de bits do algoritmo declarado coincide com o tamanho real da chave.

Por exemplo, se um certificado declarado como IV-AES256-GCM contiver uma chave de 16 bytes, a própria importação é rejeitada. Sem essa verificação, acreditando-se estar usando AES-256, o sistema operaria de fato com AES-128.


5. Exportação verify-only

Servidores que apenas realizam verificação não precisam receber a chave privada de assinatura. Para isso, o certificado DAT oferece a exportação verify-only.

Caminhos de distribuição do certificado completo e do certificado verify-only
DAT CMS
Servidor de emissão
Servidor somente de verificação
GET /v1/certs
Certificado completo (inclui a chave privada de assinatura)
GET /v1/certs/verify-only
Certificado verify-only
RequisiçãoDistribuição de certificados
Algoritmo de assinaturasupport_verify_only()Resultado da exportação verify-only
Família ECDSAtrueComo chave de assinatura sai apenas a chave pública (Base64 de 130 caracteres → 87 caracteres)
Família HMACfalseOcorre um erro explícito

O HMAC usa chave simétrica, portanto não existe algo como uma "chave capaz apenas de verificar". Por isso, ao se tentar a exportação verify-only, ela não é silenciosamente ignorada: o erro é notificado imediatamente. Como chamar a exportação verify-only com certificados HMAC misturados resulta em falha, quem opera nós exclusivamente de verificação deve usar a família ECDSA.

A chave de criptografia sai por inteiro mesmo no verify-only

A chave AES do campo secure é simétrica, portanto é sempre exportada por inteiro, independentemente de ser verify-only ou não. Isso porque, para descriptografar, é necessária a mesma chave usada para criptografar.

Ou seja, um servidor que recebeu um certificado verify-only:

  • não consegue forjar assinaturas — sem a chave privada, não consegue criar novos DATs.
  • consegue descriptografar o payload secure — não há confidencialidade em relação a ele.

O verify-only é um mecanismo para repartir a permissão de emissão, não a confidencialidade. Se um valor precisa ficar oculto dos nós de verificação, ele não deve ser colocado em secure.