Códigos de erro
Estes são os códigos de erro comuns às bibliotecas de serviço oficialmente suportadas pelo DAT.
Cada código carrega dois valores — impacto e repetição — e alguns recebem ainda a etiqueta suspeita.
Impacto — o golpe que o serviço sofre
É o critério para disparar um alerta. Observa-se apenas uma coisa: "o serviço está parado neste momento?".
| Impacto | Significado | Exemplo |
|---|---|---|
| Crítico | O serviço ou uma função específica para. Emissão impossível, sincronização com falha permanente, falha de inicialização | O servidor emissor não tem um único certificado utilizável |
| Parcial | Algumas requisições ou ciclos falham, mas o serviço continua funcionando. Em geral, recupera-se sozinho | Um ciclo do CMS falha. Tudo continua com os certificados já existentes |
| Sem impacto | Uma requisição é rejeitada e pronto | Chega um token adulterado. Basta filtrá-lo |
Sem impacto não é caso de alerta. Se toda a equipe de plantão tivesse que verificar porque uma entrada errada chegou uma única vez, o alerta perderia todo o sentido.
Suspeita — investigar se persistir
Os códigos com a etiqueta Suspeita fazem parte da operação normal quando aparecem isolados. O cliente pode enviar valores errados a qualquer momento, e o papel da biblioteca é justamente filtrá-los.
No entanto, se esses erros ocorrerem de forma persistente ou concentrados em uma origem específica, trata-se de um destes dois casos.
- Anomalia de configuração — implantação incorreta, clientes de uma versão antiga ainda em operação, ou certificados desalinhados.
- Tentativa de invasão — tentativa de passar na verificação com tokens ou chaves adulterados, ou uma varredura em busca de valores válidos.
Por isso, para esses códigos o correto é acompanhar a contagem como métrica. Basta avisar quando ultrapassar um limiar.
Repetição
| Repetição | Significado |
|---|---|
| Transitório | Resolve-se ao tentar de novo após um backoff |
| Permanente | Não repetir. É preciso corrigir a configuração ou a entrada |
| Estado | Não é um erro, e sim um sinal |
Token
Problemas com a própria cadeia do token recebido.
DAT_TOKEN_MALFORMED As partes separadas por pontos não são exatamente cinco, expire não é decimal puro, cid não é hexadecimal puro, plain ou secure não estão em base64url, ou um campo numérico ultrapassa a faixa inteira representável.
arrow_forwardRejeitar a requisição
DAT_TOKEN_EXPIREDexpire <= now. O instante exato também conta como expirado — se expire == now, o token já está expirado.
arrow_forwardInduzir a reemissão do token
DAT_TOKEN_UNKNOWNUm erro de token que não se enquadra em nenhuma das categorias acima.
arrow_forwardVerificar os logs
Nunca confunda expiração com erro de formato
As reações são opostas — a expiração é um fim de vida normal, basta levar à renovação do token; um erro de formato significa que o token nunca foi emitido por nós e deve ser rejeitado.
A análise determina primeiro a estrutura e só depois examina os valores. Uma cadeia como "1.2.3", à qual faltam partes, não é um token expirado, mas simplesmente não é um token: por isso é DAT_TOKEN_MALFORMED.
Um sinal no campo expire, como +100, também não é expiração, e sim erro de formato. Somente dígitos ASCII puros são aceitos.
Certificado
O formato da cadeia do certificado e a questão de saber se esse certificado pode ser usado agora.
DAT_CERT_MALFORMED As partes separadas por pontos não são exatamente oito, a análise de cid, start, duration ou ttl falhou, um campo de chave não está em base64url, ou start + duration + ttl ultrapassa u64.
arrow_forwardReimplantar o certificado
DAT_CERT_EXPIREDstart + duration + ttl < now. Totalmente expirado: nem emitir nem verificar é possível.
arrow_forwardRenovar o certificado
DAT_CERT_NOT_YET_ISSUABLEnow < start. A janela de emissão ainda não abriu.
arrow_forwardAguardar
DAT_CERT_ISSUANCE_ENDEDnow > start + duration, mas ainda resta ttl. Já não é possível emitir, apenas verificar.
arrow_forwardImplantar um novo certificado
DAT_CERT_VERIFY_ONLYUm certificado que contém apenas a chave pública, sem a chave privada de assinatura. Verificar funciona, emitir não.
arrow_forwardVerificar a configuração de implantação
DAT_CERT_NOT_FOUND Não há nenhum certificado correspondente ao cid do token. Ou é um token falsificado, ou uma implantação errada.
arrow_forwardRejeitar a requisição
DAT_CERT_NOT_SYNCED Esse cid ainda não foi recebido do CMS. Ocorre brevemente logo após implantar um novo certificado.
arrow_forwardTentar de novo após a sincronização
DAT_CERT_DUPLICATE_CID O mesmo cid aparece mais de uma vez na lista importada.
arrow_forwardVerificar a resposta do servidor
DAT_CERT_UNKNOWNUm erro de certificado que não se enquadra em nenhuma das categorias acima.
arrow_forwardVerificar os logs
DAT_CERT_NOT_FOUND e DAT_CERT_NOT_SYNCED apresentam os mesmos sintomas, mas exigem reações diferentes. O primeiro é um cid que nunca emitimos: esperar não muda nada. O segundo se resolve assim que a sincronização acontece.
Um DAT_CERT_NOT_FOUND isolado basta filtrar; se o número crescer de repente, é porque a implantação saiu do compasso ou há tokens falsificados circulando.
Assinatura
DAT_SIG_MISMATCHA verificação da assinatura terminou em divergência. O valor HMAC não confere, ou ECDSA verify retorna false.
arrow_forwardBloquear a sessão, log de segurança
DAT_SIG_MALFORMED A parte da assinatura está vazia, não está em base64url, o comprimento de r‖s do ECDSA não corresponde à curva, ou a conversão para DER falhou.
arrow_forwardRejeitar a requisição
DAT_SIG_KEY_MISSINGTentou-se assinar com uma chave apenas de verificação. Em tempo de execução não há chave privada.
arrow_forwardVerificar a configuração do servidor emissor
DAT_SIG_BACKENDA operação de assinatura ou verificação sequer chegou a ser executada. Tipo de chave incorreto, handle liberado, ou erro interno da biblioteca criptográfica.
arrow_forwardVerificar o tipo de chave e a biblioteca
DAT_SIG_UNKNOWNUm erro de assinatura que não se enquadra em nenhuma das categorias acima.
arrow_forwardVerificar os logs
Não misture divergência com falha do backend
Os dois códigos estão em eixos opostos.
DAT_SIG_MISMATCH— apenas uma assinatura recebida que não confere, portanto sem impacto no serviço; em contrapartida, se persistir, é caso de suspeita.DAT_SIG_BACKEND— a própria operação de verificação não rodou: é um problema do nosso lado e não um caso de suspeita.
Relatar um tipo de chave incorreto ou um bug de biblioteca como "divergência de assinatura" mistura, entre os indicadores de ataque, uma situação em que na verdade o nosso código é que está quebrado. Ao contrário, uma falsificação real classificada como erro de backend some por completo das métricas de suspeita.
Criptografia
Problemas de cifragem e decifragem do payload secure.
DAT_CRYPTO_TAG_MISMATCHA tag de autenticação AES-GCM não confere. Ou o secure foi adulterado, ou a chave do certificado é outra.
arrow_forwardBloquear a sessão, log de segurança
DAT_CRYPTO_DATA_INVALID O texto cifrado não está vazio, mas não passa do tamanho do IV (12 bytes), ou a entrada excede o limite da implementação (INT_MAX, etc.).
arrow_forwardRejeitar a requisição
DAT_CRYPTO_BACKENDA operação de cifragem ou decifragem não pôde ser executada. Plataforma sem suporte a GCM, ou falha ao inicializar o contexto.
arrow_forwardVerificar o suporte da plataforma
DAT_CRYPTO_UNKNOWNUm erro de cifragem/decifragem que não se enquadra em nenhuma das categorias acima.
arrow_forwardVerificar os logs
Um payload secure vazio não é erro. Entrada vazia vira saída vazia, e nenhum código é emitido.
No caminho que pula a verificação de assinatura, a tag GCM é a única checagem de integridade. Por isso DAT_CRYPTO_TAG_MISMATCH não é agrupado com as demais falhas de decifragem sob um mesmo código.
Chave
DAT_KEY_INVALID O comprimento da chave não corresponde ao algoritmo declarado (HMAC 32/48/64, AES 16/32), o ponto não está sobre a curva, d ∉ [1,n-1], o formato não é descomprimido (0x04), ou a chave privada e a pública não formam um par.
arrow_forwardSubstituir a chave
DAT_KEY_VERIFY_ONLY_UNSUPPORTEDSolicitou-se uma exportação apenas de verificação para um algoritmo da família HMAC.
arrow_forwardTrocar de algoritmo
DAT_KEY_UNKNOWNUm erro de chave que não se enquadra em nenhuma das categorias acima.
arrow_forwardVerificar os logs
Três casos parecidos, mas diferentes:
| Código | Significado |
|---|---|
DAT_KEY_VERIFY_ONLY_UNSUPPORTED | Limite estrutural do algoritmo. HMAC é simétrico e não tem conceito de chave pública |
DAT_SIG_KEY_MISSING | Estado em tempo de execução. Esta chave não contém, neste momento, uma chave privada |
DAT_CERT_VERIFY_ONLY | Forma de implantação. Este certificado foi implantado apenas para verificação |
Gerenciador
O estado do objeto que guarda os certificados e é usado para emitir e verificar.
DAT_MANAGER_NO_CERTIFICATENão há nenhum certificado. Ou antes da importação, ou após falhar a primeira sincronização com o CMS.
arrow_forwardVerificar a conexão com o CMS
DAT_MANAGER_NO_ISSUABLE_CERTIFICATEHá certificados, mas nenhum deles pode ser usado para emitir neste momento. A causa vem junto com o erro.
arrow_forwardDecidir conforme a causa — ver a tabela abaixo
DAT_MANAGER_DISPOSEDUm gerenciador ou certificado já liberado foi utilizado.
arrow_forwardCorrigir o código que chama
DAT_MANAGER_UNKNOWNUm erro de gerenciador que não se enquadra em nenhuma das categorias acima.
arrow_forwardVerificar os logs
A causa (cause) de DAT_MANAGER_NO_ISSUABLE_CERTIFICATE é uma destas quatro. O que fazer difere completamente conforme a origem.
| Causa | Significado | Repetição | Reação |
|---|---|---|---|
DAT_CERT_NOT_YET_ISSUABLE | Antes do início da janela de emissão | Transitório | Resolve-se esperando |
DAT_CERT_ISSUANCE_ENDED | Janela de emissão encerrada, só a verificação é possível | Permanente | É preciso implantar um novo certificado |
DAT_CERT_EXPIRED | Todo o acervo está expirado | Permanente | É preciso renovar os certificados |
DAT_CERT_VERIFY_ONLY | Todo o acervo é apenas de verificação | Permanente | É um erro de configuração da implantação |
Se o servidor emissor estiver configurado para receber apenas certificados de verificação, aparece DAT_CERT_VERIFY_ONLY. Esperar nunca resolve, portanto não é caso de repetição.
Configuração
Problemas com os valores passados por quem chama. A família CONFIG é composta inteiramente por erros que precisam ser corrigidos no código; se aparecerem em produção, é porque a implantação está errada.
DAT_CONFIG_ALG_UNSUPPORTED Nome de algoritmo desconhecido. Precisa coincidir exatamente com a notação de transporte (ECDSA-P256, IV-AES256-GCM).
arrow_forwardVerificar o nome do algoritmo
DAT_CONFIG_ARGUMENT_INVALID Um argumento obrigatório é null, está fora da faixa permitida (valor de tempo negativo, interval <= 0), é de um tipo não suportado (um número ou booleano como payload em linguagens de tipagem dinâmica), ou o corpo a ser assinado está vazio.
arrow_forwardCorrigir o código que chama
DAT_CONFIG_URI_INVALIDA URI do servidor CMS está fora da especificação. Não é analisável, o esquema não é http/https, ou há um caminho ou uma query anexada.
arrow_forwardCorrigir a URI
DAT_CONFIG_UNKNOWNUm erro de configuração que não se enquadra em nenhuma das categorias acima.
arrow_forwardVerificar os logs
Interno
Problemas do ambiente de execução e do runtime.
DAT_INTERNAL_UNAVAILABLE O backend criptográfico ou a API do runtime simplesmente não existe. Falta crypto.subtle, a plataforma não suporta AES-GCM, ou a versão do runtime é insuficiente.
arrow_forwardVerificar a implantação e a plataforma
DAT_INTERNAL_UNKNOWNFalha na alocação de memória, falha na geração de aleatoriedade, falha ao adquirir um lock, ou chegou-se a um ramo projetado como inalcançável.
arrow_forwardVerificar os logs
DAT_INTERNAL_UNAVAILABLE se resolve corrigindo o ambiente de implantação; DAT_INTERNAL_UNKNOWN costuma ser uma falha de runtime ou um bug da biblioteca.
Sincronização do CMS
Sem a sincronização com o CMS, estes códigos não aparecem.
DAT_CMS_UNREACHABLEFalha de DNS, conexão recusada, falha de TLS, tempo limite. O tempo limite não tem código próprio e está incluído aqui — a reação é a mesma.
arrow_forwardTentar de novo após um backoff
DAT_CMS_UNAUTHORIZEDO servidor respondeu 401. O token está ausente ou incorreto.
arrow_forwardVerificar a configuração do token
DAT_CMS_FORBIDDENO servidor respondeu 403. O token é válido, mas não tem permissão neste endpoint.
arrow_forwardVerificar o nível do token
DAT_CMS_ENDPOINT_NOT_FOUNDO servidor respondeu 404. A URL está errada.
arrow_forwardVerificar a configuração da URL
DAT_CMS_SERVER_ERRORO servidor respondeu 5xx.
arrow_forwardTentar de novo após um backoff
DAT_CMS_HTTP_STATUSUma resposta não-2xx que não corresponde a nenhum dos casos acima.
arrow_forwardVerificar o código de status
DAT_CMS_MALFORMEDA resposta não tem linha de versão, a linha de versão não é decimal pura, ou ultrapassa a faixa.
arrow_forwardVerificar a versão do servidor
DAT_CMS_IMPORT_FAILED A resposta chegou, mas os certificados não puderam ser aplicados. A origem vai em cause.
arrow_forwardVerificar CERT_* / KEY_* em cause
DAT_CMS_VERSION_RESETO servidor devolveu uma versão anterior à nossa. É a instrução de ressincronização completa.
arrow_forwardTratado automaticamente
DAT_CMS_NOT_SYNCEDAinda não houve nenhuma sincronização bem-sucedida.
arrow_forwardAguardar a primeira sincronização
DAT_CMS_SYNC_IN_PROGRESSA sincronização anterior ainda está rodando, por isso este ciclo foi pulado. Não é um erro.
DAT_CMS_NOT_SUPPORTEDA funcionalidade CMS não está incluída na compilação. Feature desativada ou CURL ausente.
arrow_forwardVerificar as opções de compilação
DAT_CMS_UNKNOWNUm erro de CMS que não se enquadra em nenhuma das categorias acima.
arrow_forwardVerificar os logs
Os códigos em que a sincronização é considerada falha permanente (UNAUTHORIZED, FORBIDDEN, ENDPOINT_NOT_FOUND, MALFORMED, IMPORT_FAILED) são todos críticos. Repetir não resolve nada enquanto os certificados continuam expirando: se ficar sem tratamento, o serviço acabará necessariamente parando.
Já UNREACHABLE e SERVER_ERROR são parciais. Tudo continua com os certificados existentes e a sincronização se recupera sozinha no ciclo seguinte — mas se as falhas continuarem, no fim passa para crítico. Coloque o alerta sobre o número de falhas consecutivas.
Falhas de sincronização não são lançadas como exceção
Mesmo que a primeira sincronização falhe, o gerenciador é devolvido normalmente — é melhor que a sincronização acabe acontecendo, ainda que tarde. A falha, em contrapartida, permanece como estado consultável.
| Cliente | Consulta |
|---|---|
| Rust | manager.last_error().await |
| Go | manager.LastError() |
| JavaScript | manager.lastError() |
| Python | manager.last_error() |
| Ruby | manager.last_error |
| Java/Kotlin | manager.lastError |
| C# | manager.LastError |
| C/C++ | dat_cms_manager_last_error(m) |
Se nunca houve sucesso, ali consta DAT_CMS_NOT_SYNCED; em funcionamento normal o valor está vazio.
Servidor
Códigos emitidos pelo servidor CMS. Os clientes não os geram, apenas os recebem.
DAT_AUTH_UNAUTHORIZED O cabeçalho Authorization está ausente, ou o token não está registrado em nenhum nível.
DAT_AUTH_FORBIDDENO token está registrado, mas não no nível exigido por este endpoint.
DAT_AUTH_DISABLEDNenhum token está configurado, portanto a autenticação está inteiramente desativada. Com isso, até a API de emissão de certificados fica aberta sem autenticação. Não sai na resposta, apenas é registrada no log de inicialização.
arrow_forwardConfigurar um token imediatamente
DAT_REQ_MALFORMEDOs parâmetros de caminho ou de query não são interpretáveis, ou um argumento está fora da faixa permitida (delay negativo, mais de dez anos, etc.).
DAT_REQ_ALG_UNSUPPORTEDO nome do algoritmo no caminho da requisição é desconhecido.
DAT_REQ_NOT_FOUNDEssa rota não existe ou o método é diferente.
DAT_REQ_TOO_LARGEO tamanho do corpo da requisição foi excedido.
DAT_REQ_UNKNOWNUm erro de requisição que não se enquadra em nenhuma das categorias acima.
DAT_STORE_UNAVAILABLEConexão com o banco perdida, pool de conexões esgotado, contenção de locks, tempo limite. O único código que usa 503 — o sinal pelo qual o cliente sabe que "isso melhora esperando".
arrow_forwardTentar de novo após um backoff
DAT_STORE_UNKNOWNFalha de leitura ou escrita, tabela inexistente, esquema divergente, linha de certificado corrompida.
arrow_forwardVerificar o estado do banco
Envelope de resposta:
{
"code": "DAT_REQ_ALG_UNSUPPORTED",
"details": { "algorithm": "BOGUS-ALG" }
}Para os erros que surgem ao criar e manipular certificados, o servidor usa como estão os códigos comuns acima (DAT_CERT_*, DAT_KEY_*, DAT_CONFIG_*).
Ao receber um código do servidor
O cliente envolve o código do servidor no seu próprio código CMS e preserva o original em cause.
| Recebido | HTTP | Código emitido pelo cliente |
|---|---|---|
DAT_AUTH_UNAUTHORIZED | 401 | DAT_CMS_UNAUTHORIZED |
DAT_AUTH_FORBIDDEN | 403 | DAT_CMS_FORBIDDEN |
DAT_REQ_NOT_FOUND | 404 | DAT_CMS_ENDPOINT_NOT_FOUND |
DAT_REQ_* (os demais) | 400·405·413 | DAT_CMS_HTTP_STATUS |
DAT_STORE_UNAVAILABLE | 503 | DAT_CMS_SERVER_ERROR |
DAT_STORE_UNKNOWN | 500 | DAT_CMS_SERVER_ERROR |
| (regressão de versão) | 200 | DAT_CMS_VERSION_RESET |
Buscar por sintoma
| Sintoma | Código |
|---|---|
| Funciona logo após o login e pouco depois é rejeitado | DAT_TOKEN_EXPIRED — A vida útil do token acabou. Basta reemitir |
| A verificação falha só em um servidor específico | DAT_CERT_NOT_SYNCED — Esse servidor ainda não recebeu o novo CID |
| O mesmo token é rejeitado em todos os servidores | DAT_CERT_NOT_FOUND — Um CID que nunca emitimos |
| O servidor emissor não consegue criar tokens | DAT_MANAGER_NO_ISSUABLE_CERTIFICATE + DAT_CERT_VERIFY_ONLY — Foi implantado como verify-only |
| A emissão falha apenas logo após a inicialização | DAT_MANAGER_NO_CERTIFICATE — Antes da primeira sincronização. Resolve-se em breve |
| A sincronização com o CMS falha continuamente | DAT_CMS_UNAUTHORIZED — O token está errado. Repetir não resolve |
| Não chega nenhum certificado | DAT_CMS_ENDPOINT_NOT_FOUND — Há um erro de digitação na URL |
| Falha apenas em uma plataforma específica | DAT_INTERNAL_UNAVAILABLE — Falta o backend criptográfico |
| As falhas de verificação aumentam de repente | DAT_SIG_MISMATCH — Isolada é inofensiva, mas em massa é tentativa de falsificação |
| A decifragem do secure falha de repente | DAT_CRYPTO_TAG_MISMATCH — Certificados desalinhados ou tentativa de adulteração |
| Aviso no log de inicialização do CMS | DAT_AUTH_DISABLED — A autenticação está desligada. A API de emissão está aberta |
Apêndice
Sintaxe dos códigos
DAT_<área>_<causa>- Quando a mesma causa ocorre em áreas diferentes, o nome da causa é idêntico.
DAT_TOKEN_MALFORMEDeDAT_CERT_MALFORMEDdiferem apenas no objeto; o sentido é o mesmo. _UNKNOWNé exclusivamente o recuo de cada área. Não é usado com outro sentido, como "algoritmo desconhecido" (para isso existe_UNSUPPORTED).- A cadeia do código é um contrato público. A mensagem pode ser alterada livremente; o código, não.
| Categoria | Prefixo de código |
|---|---|
| Token | DAT_TOKEN_ |
| Certificado | DAT_CERT_ |
| Assinatura | DAT_SIG_ |
| Criptografia | DAT_CRYPTO_ |
| Chave | DAT_KEY_ |
| Gerenciador | DAT_MANAGER_ |
| Configuração | DAT_CONFIG_ |
| Interno | DAT_INTERNAL_ |
| Sincronização do CMS | DAT_CMS_ |
| Servidor | DAT_AUTH_ · DAT_REQ_ · DAT_STORE_ |
Acesso conforme o cliente
| Cliente | Tipo de erro | Código | Classe de repetição | Evento de segurança |
|---|---|---|---|---|
| Rust | DatError enum | err.code() | err.retry() | err.security_event() |
| Go | *dat.Error | err.Code | dat.Retry(err) | dat.SecurityEvent(err) |
| JavaScript | DatError extends Error | e.code | e.retry | e.securityEvent |
| Python | DatError(ValueError, RuntimeError) | e.code | e.retry | e.security_event |
| Ruby | Saro::Dat::Error | e.code | e.retry | e.security_event? |
| Java/Kotlin | DatException | e.code | e.retry | e.securityEvent |
| C# | DatException | e.Code | e.Retry | e.SecurityEvent |
| C/C++ | dat_error_t | dat_error_code(e) | dat_error_retry(e) | dat_error_is_security_event(e) |
| Servidor CMS | Envelope JSON | campo code | — | — |
Evento de segurança só retorna true nos dois casos em que a falsificação ou a adulteração é certa (DAT_SIG_MISMATCH, DAT_CRYPTO_TAG_MISMATCH). A etiqueta suspeita deste documento abrange mais (chegando a tokens, chaves e requisições adulterados); por ora é apenas uma classificação da documentação e não é exposta pela API do cliente.
O nível de impacto também é uma classificação da documentação. Um mesmo código pode atingir de formas diferentes conforme onde ocorre — DAT_KEY_INVALID, por exemplo, não tem impacto quando serve para filtrar um token recebido, mas faz toda a sincronização fracassar quando ocorre ao ler um certificado durante a sincronização com o CMS.
As causas subjacentes não são perdidas. DAT_MANAGER_NO_ISSUABLE_CERTIFICATE e DAT_CMS_IMPORT_FAILED transmitem a origem pelo encadeamento de exceções de cada linguagem (cause / __cause__ / InnerException / Unwrap()).
C/C++ também mantém os valores inteiros
Os valores inteiros existentes de dat_error_t são mantidos por compatibilidade de ABI, mas quem vale é o código textual. A biblioteca não devolve mais os valores antigos, portanto uma comparação como err == DAT_ERROR_INVALID_DAT já não confere. Compare por meio de dat_error_code(e).
C não tem encadeamento de exceções, então a causa é consultada à parte com dat_manager_issuable_cause().