Skip to main content
このページでは、X Chat の暗号化と Chat XDK に固有の問題(鍵、セキュアキーバックアップ、復号/検証、および暗号化された送信ペイロードの構築)を扱います。 Webhook、OAuth、HTTP ステータスコード、レート制限については、一般の X API および 認証 のドキュメントを使用してください。

鍵とセキュアキーバックアップ

アンロックに失敗する(無効なパスコード)

  • パスコードが setup で使用したものと一致していることを確認してください
  • 試行の間に待機してください。レルムは誤答をレート制限し、失敗が多すぎると復元をロックすることがあります

鍵やアイデンティティがセットされていないため暗号化/復号が失敗する

まず秘密鍵をロードし、次にセッションアイデンティティを設定してください——あなたのユーザー ID と、X 上のレコードの public_key_version です。encrypt_* および prepare_* メソッドはこれで署名します。セッションアイデンティティなし(かつ明示的な呼び出し単位のオーバーライドもなし)でこれらを呼び出すとエラーになります。

メッセージに対する会話鍵が見つからない

Message encrypted with key version '…' but no matching key found のようなエラーは、そのメッセージの conversation_key_version に対応する生の鍵を持っていないことを意味します。
  1. conversation_key_change_event(ライブイベント)または meta.conversation_key_events(履歴)の鍵素材を extract_conversation_keys で復号する、あるいはそれらのブロブを decrypt_events に含める。set_cache_keys(true) が有効なら、decrypt_events は各会話の最新の検証済み鍵も保持するため、以後の decrypt_eventencrypt_* の呼び出しでは省略できます
  2. そのバージョンに対して会話鍵が追加されており、まだ参加者であることを確認してください(はじめに を参照)

ピアに公開鍵がない

ピアがオンボードを完了していない可能性があります。登録後、API リファレンス → Encryption keys から public_keysigning_public_keyidentity_public_key_signaturepublic_key_version をロードしてください。

復号と署名

復号に失敗する

  • 生の会話鍵が古い/誤っている、または鍵バージョンが間違っている
  • encoded_event 文字列が不完全である
  • イベントタイプが復号可能なコンテンツとして扱える暗号化メッセージではない

署名が検証されない

検証はデフォルトで失敗クローズです(reject_unverified = true):SDK は検証されていない署名付きイベントを既に拒否しているため、ここで失敗した場合は、チェックを有効にする必要があるのではなく、検証入力が誤っていることを意味します。よくある原因:
  • 送信者の署名鍵エントリが欠落または不完全(Chat XDK が必要とするすべてのフィールド——Chat XDK リファレンスを参照)
  • 呼び出しに署名鍵が渡されておらず、set_signing_keys で保存されているものもない
  • 送信者がバージョンをローテーションした——公開鍵を再取得してください
  • 許容フロアより下の鍵バージョンは決して検証されません
set_reject_unverified セッターは、このデフォルトからオプトアウトするために存在します(false。推奨されません)。以前に無効にした場合は、失敗クローズのデフォルトに戻してください。

返信に reply_preview_validation: "Invalid" が付いている

復号された返信は reply_preview_validation("Valid" / "Invalid"。JavaScript は 'valid' / 'invalid')を持つことがあります。Invalid は、メッセージ内の引用プレビューが埋め込まれた署名済みオリジナルイベントと一致しないことを意味します——引用は信頼できないものとして扱い、検証済みオリジナルからのみ引用内容を描画してください。メッセージ自体は別途検証されており、依然として本物です。プレビューが無効でも何もスローされません。

古いイベントが恒久的に検証に失敗する

signature missing or no matching signing key や、古いイベントでの ECDSA 不一致のようなエラーは恒久的です。署名は不変であり、イベント自体から署名済みペイロードを再構築することで検証されます。そのため、異なるバイトに署名された(あるいはまったく署名されていない)イベントは、以後のロードでも毎回失敗します——リトライ、鍵の更新、API 呼び出しでは修復できません。これらのイベントはリトライ可能なエラーではなく tombstone として扱ってください。会話鍵をローテーションすれば、そこから先はクリーンで検証可能な履歴が始まります。新しいメッセージは影響を受けません。

送信ペイロードの構築

これらのミスは X Chat 暗号化に固有です(一般的な HTTP エラーではありません):

状態を変更する呼び出しで API が 400 を返す

状態を変更するすべてのチャット呼び出し(会話鍵の追加やローテーション、グループの作成、メンバーの追加)は、リクエストボディに action_signatures を必要とし、API 境界で検証されます。エントリが欠落または不正な形式(それぞれに message_idencoded_message_event_detail、および signaturepublic_key_versionsignature_version を持つ message_event_signature が必要)の場合、直ちに HTTP 400 problem-details レスポンスを返します。SDK の prepare メソッド(prepare_conversation_key_changeprepare_group_createprepare_group_members_change)を使い、返されたすべての署名を送信してください——グループ作成とメンバー追加は 2 つ返します。

メディアの暗号化と復号

  • 添付を参照するメッセージと同じ会話鍵(およびバージョン)を使用してください
  • ダウンロードレスポンスは、decrypt_stream を実行するまで暗号文として扱ってください
  • MIME タイプは復号後に推測してください。ダウンロードの Content-Type は多くの場合、実際の画像タイプではありません
詳細:メディア

安全なデバッグ

暗号化の失敗を調査する際は:
  • 会話 ID、イベント ID、鍵のバージョンのみをログに出力してください
  • 平文、パスコード、秘密鍵、完全な鍵ブロブはログに出力しないでください
  • set_identity に渡した署名鍵バージョンが public-key レコードの public_key_version と一致することを確認してください
  • 履歴が不完全な場合は、鍵変更メタデータがスキップされないよう、復号前にすべてのイベントページをページングしてください