Chaves e backup seguro de chaves
O desbloqueio falha (código de acesso inválido)
- Confirme que o código de acesso corresponde ao usado com
setup - Aguarde entre tentativas; realms limitam tentativas incorretas e podem travar a recuperação após muitas falhas
- Python
- TypeScript
- Rust
- Go
- C#
- Java
Criptografar ou descriptografar falha porque as chaves não foram carregadas
Carregue as chaves privadas primeiro e depois defina a versão de chave pública do seu registro no X.- Python
- TypeScript
- Rust
- Go
- C#
- Java
Chave de conversa ausente para uma mensagem
Você não tem a chave em bruto para oconversation_key_version daquela mensagem.
- Descriptografe o material de chave a partir de
conversation_key_change_event(eventos ao vivo) oumeta.conversation_key_events(histórico) comextract_conversation_keys, ou inclua esses blobs emdecrypt_events - Confirme que as chaves de conversa foram adicionadas para essa versão e que você ainda é um participante (veja Guia de introdução)
O par não tem chaves públicas
Pode ser que ele não tenha concluído o onboarding. Depois que ele se registrar, carreguepublic_key, signing_public_key, identity_public_key_signature e public_key_version a partir de Referência da API → Chaves de criptografia.
Descriptografia e assinaturas
A descriptografia falha
- Chave de conversa em bruto obsoleta ou errada, ou versão de chave errada
- String
encoded_eventincompleta - O tipo de evento não é uma mensagem criptografada que você pode tratar como conteúdo descriptografável
A assinatura não verifica
A verificação é fail-closed por padrão (reject_unverified = true): o SDK já rejeita eventos assinados não verificados, então uma falha aqui significa que as entradas de verificação estão erradas, e não que você precisa ativar a verificação. Causas comuns:
- Entrada de chave de assinatura ausente ou incompleta para o remetente (todos os campos exigidos pelo Chat XDK — veja a referência do Chat XDK)
- O remetente rotacionou versões — busque as chaves públicas dele novamente
- Uma versão de chave abaixo do piso aceito nunca é verificada
set_reject_unverified existe para você desabilitar esse padrão (false, não recomendado). Se você o desativou antes, restaure o padrão fail-closed:
- Python
- TypeScript
- Rust
- Go
- C#
- Java
Eventos antigos falham permanentemente na verificação
Erros comosignature missing or no matching signing key ou uma incompatibilidade ECDSA em eventos antigos são permanentes. Assinaturas são imutáveis e verificadas reconstruindo o payload assinado a partir do próprio evento, então um evento que foi assinado sobre bytes diferentes (ou nunca foi assinado) falha em cada carregamento futuro — nenhuma nova tentativa, atualização de chave ou chamada de API pode curá-lo. Trate esses eventos como lápides, não como erros repetíveis. Rotacionar a chave de conversa inicia um histórico limpo e verificável a partir daquele ponto; novas mensagens não são afetadas.
Construindo o payload de envio
Estes erros são específicos da criptografia do X Chat (não são erros HTTP gerais):A API retorna 400 para uma chamada que altera estado
Toda chamada de chat que altera estado — adicionar ou rotacionar chaves de conversa, criar um grupo, adicionar membros — requeraction_signatures no corpo da requisição, validado na fronteira da API. Uma entrada ausente ou malformada (cada uma precisa de message_id, encoded_message_event_detail e um message_event_signature com signature, public_key_version e signature_version) retorna imediatamente uma resposta HTTP 400 problem-details. Use os métodos prepare do SDK (prepare_conversation_key_change, prepare_group_create, prepare_group_members_change) e envie todas as assinaturas retornadas — criar grupo e adicionar membros retornam duas.
Criptografar e descriptografar mídia
- Use a mesma chave de conversa (e versão) da mensagem que referencia o anexo
- Trate respostas de download como texto cifrado até executar
decrypt_stream - Deduza o tipo MIME após descriptografar; o
Content-Typedo download frequentemente não é o tipo real da imagem
Depuração segura
Ao investigar falhas de criptografia:- Registre apenas IDs de conversa, IDs de evento e versões de chave
- Não registre texto simples, códigos de acesso, chaves privadas ou blobs de chave completos
- Confirme que
set_key_versioncorresponde aopublic_key_versionno seu registro de chave pública - Para histórico incompleto, pagine todas as páginas de eventos para que os metadados de mudança de chave não sejam pulados antes de descriptografar