DAT
ドキュメント

エラーコード

DAT が公式にサポートするサービスライブラリ共通のエラーコードです。

各コードには 影響リトライ の 2 つの値が付き、一部にはさらに 疑い のタグが付きます。

影響 — サービスが受ける打撃

アラートを設定する基準です。「いまサービスが止まっているか」だけを見ます。

影響意味
致命的サービスまたは特定機能が停止します。 発行不可、同期の恒久的な失敗、初期化の失敗発行サーバーに使える証明書が 1 枚もない
部分的一部のリクエストやサイクルは失敗しますが、サービスは動き続けます。多くは自力で回復しますCMS の 1 サイクルが失敗。既存の証明書で動作継続
影響なしリクエストを 1 件拒否して終わりです改ざんされたトークンが届いた。弾けばそれで済む

影響なし はアラートの対象ではありません。不正な入力が 1 件来ただけで担当者全員が確認しなければならないなら、アラートは意味を失います。

疑い — 続くようなら調査

疑い タグが付いたコードは、1 件だけなら通常運用の一部です。クライアントはいつでも不正な値を送ってくる可能性があり、それを弾くのがライブラリ本来の役目です。

ただしこうしたエラーが継続的に、あるいは特定の発信元からまとまって発生する場合は、次の 2 つのどちらかです。

  • 設定の異常 — デプロイが誤っている、旧バージョンのクライアントが残っている、証明書が食い違っている。
  • 攻撃の試み — トークンや鍵を改ざんして検証を通そうとしている、あるいは有効な値を探る探索行為。

そのためこれらのコードは 件数をメトリクスとして取っておくのが正解です。しきい値を超えたときだけ通知すれば十分です。

リトライ

リトライ意味
一時的バックオフしてリトライすれば解消します
恒久的リトライ禁止。設定や入力を直す必要があります
状態エラーではなくシグナルです

トークン

受け取ったトークン文字列そのものの問題です。

DAT_TOKEN_MALFORMED影響なし恒久的shield疑い

ドット区切りのパートが 5 個でない、expire が純粋な 10 進数でない、cid が純粋な 16 進数でない、plainsecure が base64url でない、数値フィールドが整数の表現範囲を超えた、のいずれかです。

arrow_forwardリクエストを拒否

DAT_TOKEN_EXPIRED影響なし恒久的

expire <= now同時刻でも期限切れです — expire == now はすでに期限切れとみなします。

arrow_forwardトークンの再発行を促す

DAT_TOKEN_UNKNOWN部分的恒久的

上のいずれにも分類されないトークンエラーです。

arrow_forwardログを確認

期限切れと形式エラーは必ず区別します

対応が正反対です — 期限切れは正常な寿命の終わりなのでトークンを更新させればよく、形式エラーのトークンはそもそも発行されたものではないため、拒否すべきです。

パースはまず構造を確定してから値を見ます。"1.2.3" のようにパートが足りない文字列は、期限切れのトークンではなくそもそもトークンではないため DAT_TOKEN_MALFORMED です。

expire フィールドが +100 のように符号付きの場合も、期限切れではなく形式エラーです。純粋な ASCII 数字だけを受け付けます。


証明書

証明書文字列の形式、およびその証明書がいま使えるかどうかの問題です。

DAT_CERT_MALFORMED致命的恒久的

ドット区切りのパートが 8 個でない、cidstartdurationttl のパースに失敗した、鍵フィールドが base64url でない、start + duration + ttl が u64 を超えた、のいずれかです。

arrow_forward証明書を再配布

DAT_CERT_EXPIRED致命的恒久的

start + duration + ttl < now。発行も検証もできない完全な期限切れ状態です。

arrow_forward証明書を更新

DAT_CERT_NOT_YET_ISSUABLE致命的一時的

now < start。発行ウィンドウがまだ開いていません。

arrow_forward待機

DAT_CERT_ISSUANCE_ENDED致命的恒久的

now > start + duration ですが ttl は残っています。発行はできず、検証のみ可能です。

arrow_forward新しい証明書を配布

DAT_CERT_VERIFY_ONLY致命的恒久的

署名用秘密鍵を持たず、公開鍵だけが入った証明書です。検証はできますが発行はできません。

arrow_forward配布設定を確認

DAT_CERT_NOT_FOUND影響なし恒久的shield疑い

トークンの cid に対応する証明書を保有していません。偽造トークンか、配布ミスです。

arrow_forwardリクエストを拒否

DAT_CERT_NOT_SYNCED部分的一時的

その cid をまだ CMS から受け取っていません。新しい証明書を配布した直後に短時間だけ発生します。

arrow_forward同期後にリトライ

DAT_CERT_DUPLICATE_CID致命的恒久的

import するリストの中に同じ cid が 2 回以上入っています。

arrow_forwardサーバーのレスポンスを確認

DAT_CERT_UNKNOWN部分的恒久的

上のいずれにも分類されない証明書エラーです。

arrow_forwardログを確認

DAT_CERT_NOT_FOUNDDAT_CERT_NOT_SYNCED は外から見た症状は同じですが、対応が異なります。前者はそもそも発行されていない cid なので待っても現れず、後者は同期さえ済めば解消します。

DAT_CERT_NOT_FOUND は 1 件なら弾くだけで済みますが、急に増えた場合は配布が食い違っているか、偽造トークンが出回っているという意味です。


署名

DAT_SIG_MISMATCH影響なし恒久的shield疑い

署名検証が不一致で終わりました。HMAC の値が異なるか、ECDSA verify が false です。

arrow_forwardセッションを遮断、セキュリティログへ

DAT_SIG_MALFORMED影響なし恒久的shield疑い

署名パートが空、base64url でない、ECDSA の r‖s 長が曲線と合わない、DER 変換に失敗した、のいずれかです。

arrow_forwardリクエストを拒否

DAT_SIG_KEY_MISSING致命的恒久的

verify-only の鍵で署名しようとしました。実行時に秘密鍵が存在しない状態です。

arrow_forward発行サーバーの設定を確認

DAT_SIG_BACKEND部分的恒久的

署名・検証の演算そのものが実行できませんでした。誤った鍵の型、解放済みのハンドル、暗号ライブラリの内部エラーです。

arrow_forward鍵の型とライブラリを確認

DAT_SIG_UNKNOWN部分的恒久的

上のいずれにも分類されない署名エラーです。

arrow_forwardログを確認

不一致とバックエンド障害を混ぜないでください

2 つのコードは軸が正反対です。

  • DAT_SIG_MISMATCH — 届いた署名が合わなかっただけなのでサービスへの影響はなく、代わりに続くようなら 疑い の対象です。
  • DAT_SIG_BACKEND — 検証の演算自体が回らなかったので実装側の問題であり、疑いの対象ではありません。

誤った鍵の型やライブラリのバグを「署名不一致」として報告すると、実際には実装側が壊れている状況が攻撃指標に混ざり込みます。逆に本物の偽造がバックエンドエラーに分類されると、疑いの指標から丸ごと抜け落ちます。


暗号化

secure ペイロードの暗号化・復号の問題です。

DAT_CRYPTO_TAG_MISMATCH影響なし恒久的shield疑い

AES-GCM の認証タグが一致しません。secure が改ざんされたか、証明書の鍵が異なります。

arrow_forwardセッションを遮断、セキュリティログへ

DAT_CRYPTO_DATA_INVALID影響なし恒久的shield疑い

暗号文が空ではないのに IV (12 バイト) 以下であるか、入力が実装上の限界 (INT_MAX など) を超えました。

arrow_forwardリクエストを拒否

DAT_CRYPTO_BACKEND部分的恒久的

暗号化・復号の演算が実行できませんでした。GCM 非対応のプラットフォームか、コンテキストの初期化失敗です。

arrow_forwardプラットフォームの対応状況を確認

DAT_CRYPTO_UNKNOWN部分的恒久的

上のいずれにも分類されない暗号化・復号エラーです。

arrow_forwardログを確認

空の secure ペイロードはエラーではありません。 空の入力は空の出力になり、コードは一切出ません。

署名検証をスキップする経路では、GCM タグが唯一の完全性チェックです。そのため DAT_CRYPTO_TAG_MISMATCH を他の復号失敗と同じコードにまとめていません。


DAT_KEY_INVALID影響なし恒久的shield疑い

宣言したアルゴリズムと鍵長が一致しない (HMAC 32/48/64、AES 16/32)、曲線上にない点である、d ∉ [1,n-1] である、非圧縮 (0x04) 形式でない、秘密鍵と公開鍵が対になっていない、のいずれかです。

arrow_forward鍵を交換

DAT_KEY_VERIFY_ONLY_UNSUPPORTED致命的恒久的

HMAC 系に対して verify-only のエクスポートを要求しました。

arrow_forwardアルゴリズムを変更

DAT_KEY_UNKNOWN部分的恒久的

上のいずれにも分類されない鍵エラーです。

arrow_forwardログを確認

似て見えるが別物の 3 つ:

コード意味
DAT_KEY_VERIFY_ONLY_UNSUPPORTEDアルゴリズムの構造的な限界。 HMAC は共通鍵なので公開鍵という概念がありません
DAT_SIG_KEY_MISSING実行時の状態。 いまこの鍵に秘密鍵が入っていません
DAT_CERT_VERIFY_ONLY配布の形。 この証明書が検証専用として配布されました

マネージャー

証明書を保持し、発行・検証に使うオブジェクトの状態です。

DAT_MANAGER_NO_CERTIFICATE致命的一時的

証明書を 1 枚も保有していません。import 前か、CMS の初回同期に失敗した状態です。

arrow_forwardCMS 接続を確認

DAT_MANAGER_NO_ISSUABLE_CERTIFICATE致命的恒久的

証明書はありますが、いま発行に使えるものがありません。理由が一緒に渡されます。

arrow_forward理由 (cause) を見て判断 — 下の表

DAT_MANAGER_DISPOSED致命的恒久的

すでに解放されたマネージャーまたは証明書を使用しました。

arrow_forward呼び出しコードを修正

DAT_MANAGER_UNKNOWN部分的恒久的

上のいずれにも分類されないマネージャーエラーです。

arrow_forwardログを確認

DAT_MANAGER_NO_ISSUABLE_CERTIFICATE の理由 (cause) は 4 つのうちのいずれかです。原因ごとにやるべきことがまったく異なります。

理由意味リトライ対応
DAT_CERT_NOT_YET_ISSUABLE発行ウィンドウの開始前一時的待てば解消します
DAT_CERT_ISSUANCE_ENDED発行ウィンドウ終了、検証のみ可能恒久的新しい証明書を配布する必要があります
DAT_CERT_EXPIRED保有分がすべて期限切れ恒久的証明書の更新が必要です
DAT_CERT_VERIFY_ONLY保有分がすべて検証専用恒久的配布設定のミスです

発行サーバーが検証専用の証明書だけを受け取るよう設定されていると DAT_CERT_VERIFY_ONLY が出ます。待っても決して解消しないので、リトライの対象ではありません。


設定

呼び出し側が渡した値の問題です。CONFIG 系はすべてコードを直す必要のあるエラーであり、運用中に出た場合はデプロイが誤っています。

DAT_CONFIG_ALG_UNSUPPORTED致命的恒久的

未知のアルゴリズム名です。ワイヤ表記 (ECDSA-P256IV-AES256-GCM) と正確に一致する必要があります。

arrow_forwardアルゴリズム名を確認

DAT_CONFIG_ARGUMENT_INVALID致命的恒久的

必須の引数が null、許容範囲外 (負の時間値、interval <= 0)、サポートされない型 (動的型付け言語で payload に数値やブール値を渡した)、署名対象の body が空、のいずれかです。

arrow_forward呼び出しコードを修正

DAT_CONFIG_URI_INVALID致命的恒久的

CMS サーバーの URI が仕様外です。パース不可、スキームが http/https でない、パスやクエリが付いている場合です。

arrow_forwardURI を修正

DAT_CONFIG_UNKNOWN致命的恒久的

上のいずれにも分類されない設定エラーです。

arrow_forwardログを確認


内部

実行環境とランタイムの問題です。

DAT_INTERNAL_UNAVAILABLE致命的恒久的

暗号バックエンドやランタイム API がまったくありません。crypto.subtle の不在、AES-GCM 非対応のプラットフォーム、ランタイムのバージョン不足です。

arrow_forwardデプロイとプラットフォームを確認

DAT_INTERNAL_UNKNOWN致命的恒久的

メモリ確保の失敗、乱数生成の失敗、ロック取得の失敗、到達不能として設計された分岐への到達です。

arrow_forwardログを確認

DAT_INTERNAL_UNAVAILABLE はデプロイ環境を直せば解決し、DAT_INTERNAL_UNKNOWN はたいていランタイム障害かライブラリのバグです。


CMS 同期

CMS 同期を使わなければこれらのコードは出ません。

DAT_CMS_UNREACHABLE部分的一時的

DNS 失敗、接続拒否、TLS 失敗、タイムアウトです。タイムアウトは別コードではなくここに含まれます — 対応が同じだからです。

arrow_forwardバックオフ後にリトライ

DAT_CMS_UNAUTHORIZED致命的恒久的401

サーバーが 401 で応答しました。トークンがないか誤っています。

arrow_forwardトークン設定を確認

DAT_CMS_FORBIDDEN致命的恒久的403

サーバーが 403 で応答しました。トークンは有効ですが、このエンドポイントの権限がありません。

arrow_forwardトークンの等級を確認

DAT_CMS_ENDPOINT_NOT_FOUND致命的恒久的404

サーバーが 404 で応答しました。URL が誤っています。

arrow_forwardURL 設定を確認

DAT_CMS_SERVER_ERROR部分的一時的5xx

サーバーが 5xx で応答しました。

arrow_forwardバックオフ後にリトライ

DAT_CMS_HTTP_STATUS致命的恒久的

上に該当しない非 2xx の応答です。

arrow_forwardステータスコードを確認

DAT_CMS_MALFORMED致命的恒久的

レスポンスに version 行がない、version 行が純粋な 10 進数でない、範囲を超えた、のいずれかです。

arrow_forwardサーバーのバージョンを確認

DAT_CMS_IMPORT_FAILED致命的恒久的

レスポンスは受け取りましたが、証明書を適用できませんでした。原因は cause に入っています。

arrow_forwardcause の CERT_* / KEY_* を確認

DAT_CMS_VERSION_RESET影響なし状態200

サーバーがクライアントより古い version を返しました。全体の再同期の指示です。

arrow_forward自動的に処理されます

DAT_CMS_NOT_SYNCED致命的一時的

まだ一度も同期に成功していない状態です。

arrow_forward初回同期を待つ

DAT_CMS_SYNC_IN_PROGRESS影響なし状態

前回の同期がまだ動いているため、今回のサイクルをスキップしました。エラーではありません。

DAT_CMS_NOT_SUPPORTED致命的恒久的

CMS 機能がビルドに含まれていません。feature が無効か、CURL が同梱されていません。

arrow_forwardビルドオプションを確認

DAT_CMS_UNKNOWN部分的恒久的

上のいずれにも分類されない CMS エラーです。

arrow_forwardログを確認

同期が恒久的な失敗と判定されるコード (UNAUTHORIZEDFORBIDDENENDPOINT_NOT_FOUNDMALFORMEDIMPORT_FAILED) はすべて致命的です。リトライしても解消しないまま証明書は期限切れになり続けるため、放置すればサービスは必ず止まります。

逆に UNREACHABLESERVER_ERROR は部分的です。既存の証明書で動作を続け、次のサイクルで自力回復します — ただし失敗し続ければ最終的には致命に移ります。 連続失敗回数を基準にアラートを設定してください。

同期の失敗は例外として投げられません

初回の同期に失敗してもマネージャーは正常に返されます — 遅れてでも同期されるほうがよいからです。代わりに失敗は参照可能な状態として残ります。

クライアント参照方法
Rustmanager.last_error().await
Gomanager.LastError()
JavaScriptmanager.lastError()
Pythonmanager.last_error()
Rubymanager.last_error
Java/Kotlinmanager.lastError
C#manager.LastError
C/C++dat_cms_manager_last_error(m)

一度も成功していなければ DAT_CMS_NOT_SYNCED、正常なら空です。


サーバー

CMS サーバーが出すコードです。クライアントはこれらのコードを生成せず、受け取るだけです。

DAT_AUTH_UNAUTHORIZED影響なし恒久的shield疑い401

Authorization ヘッダがないか、トークンがどの等級にも登録されていません。

DAT_AUTH_FORBIDDEN影響なし恒久的shield疑い403

トークンは登録されていますが、このエンドポイントが要求する等級ではありません。

DAT_AUTH_DISABLED致命的状態

トークンが 1 つも設定されておらず、認証が丸ごと無効です。証明書発行 API まで認証なしで開いています。レスポンスとしては返らず、起動ログにのみ出力されます。

arrow_forwardただちにトークンを設定

DAT_REQ_MALFORMED影響なし恒久的shield疑い400

パスやクエリのパラメータを解釈できないか、引数が許容範囲外 (負の delay、10 年超など) です。

DAT_REQ_ALG_UNSUPPORTED影響なし恒久的400

リクエストパスのアルゴリズム名が未知です。

DAT_REQ_NOT_FOUND影響なし恒久的shield疑い404·405

そのようなルートがないか、メソッドが異なります。

DAT_REQ_TOO_LARGE影響なし恒久的shield疑い413

リクエストボディのサイズが上限を超えました。

DAT_REQ_UNKNOWN影響なし恒久的400

上のいずれにも分類されないリクエストエラーです。

DAT_STORE_UNAVAILABLE部分的一時的503

DB 接続の切断、コネクションプールの枯渇、ロック競合、タイムアウトです。503 を使う唯一のコードであり、クライアントが「これは待てば直る」と判断できる唯一のシグナルです。

arrow_forwardバックオフ後にリトライ

DAT_STORE_UNKNOWN致命的恒久的500

参照・書き込みの失敗、テーブルの不在、スキーマの不一致、保存された証明書行の破損です。

arrow_forwardDB の状態を確認

レスポンスのエンベロープ:

json
{
  "code": "DAT_REQ_ALG_UNSUPPORTED",
  "details": { "algorithm": "BOGUS-ALG" }
}

証明書を生成・処理する過程で出るエラーは、サーバーも上記の共通コード (DAT_CERT_*DAT_KEY_*DAT_CONFIG_*) をそのまま使います。

サーバーのコードを受け取ったら

クライアントはサーバーのコードを自身の CMS コードで包み、元のコードは cause に保存します。

受け取ったものHTTPクライアントが出すコード
DAT_AUTH_UNAUTHORIZED401DAT_CMS_UNAUTHORIZED
DAT_AUTH_FORBIDDEN403DAT_CMS_FORBIDDEN
DAT_REQ_NOT_FOUND404DAT_CMS_ENDPOINT_NOT_FOUND
DAT_REQ_* (その他)400·405·413DAT_CMS_HTTP_STATUS
DAT_STORE_UNAVAILABLE503DAT_CMS_SERVER_ERROR
DAT_STORE_UNKNOWN500DAT_CMS_SERVER_ERROR
(version の巻き戻し)200DAT_CMS_VERSION_RESET

症状から探す

症状コード
ログイン直後は通るのに、しばらくすると拒否されるDAT_TOKEN_EXPIRED — トークンの寿命が尽きました。再発行すれば済みます
特定のサーバーだけ検証に失敗するDAT_CERT_NOT_SYNCED — そのサーバーがまだ新しい CID を受け取っていません
すべてのサーバーで同じトークンが拒否されるDAT_CERT_NOT_FOUND — 発行された記録のない CID です
発行サーバーがトークンを作れないDAT_MANAGER_NO_ISSUABLE_CERTIFICATE + DAT_CERT_VERIFY_ONLYverify-only で配布されています
起動直後だけ発行に失敗するDAT_MANAGER_NO_CERTIFICATE — 初回同期の前です。しばらくすると解消します
CMS 同期が失敗し続けるDAT_CMS_UNAUTHORIZED — トークンが誤っています。リトライしても解消しません
証明書が 1 枚も来ないDAT_CMS_ENDPOINT_NOT_FOUND — URL の誤記です
特定のプラットフォームだけ失敗するDAT_INTERNAL_UNAVAILABLE — 暗号バックエンドがありません
検証失敗が急に増えたDAT_SIG_MISMATCH — 1 件なら無害ですが、まとまって出るなら偽造の試みです
secure の復号が急に失敗するDAT_CRYPTO_TAG_MISMATCH — 証明書が食い違っているか、改ざんです
CMS の起動ログに警告が出るDAT_AUTH_DISABLED認証が切れています。 発行 API が開いています

付録

コードの文法

DAT_<領域>_<原因>
  • 同じ原因が異なる領域で出る場合、原因名は同じです。DAT_TOKEN_MALFORMEDDAT_CERT_MALFORMED は対象が違うだけで意味は同じです。
  • _UNKNOWN は各領域のフォールバック専用です。「未知のアルゴリズム」のような別の意味では使いません (それは _UNSUPPORTED です)。
  • コード文字列は公開された契約です。メッセージは自由に変えてよいですが、コードは変えません。
分類コードの接頭辞
トークンDAT_TOKEN_
証明書DAT_CERT_
署名DAT_SIG_
暗号化DAT_CRYPTO_
DAT_KEY_
マネージャーDAT_MANAGER_
設定DAT_CONFIG_
内部DAT_INTERNAL_
CMS 同期DAT_CMS_
サーバーDAT_AUTH_ · DAT_REQ_ · DAT_STORE_

クライアント別のアクセス方法

クライアントエラー型コードリトライ分類セキュリティイベント
RustDatError enumerr.code()err.retry()err.security_event()
Go*dat.Errorerr.Codedat.Retry(err)dat.SecurityEvent(err)
JavaScriptDatError extends Errore.codee.retrye.securityEvent
PythonDatError(ValueError, RuntimeError)e.codee.retrye.security_event
RubySaro::Dat::Errore.codee.retrye.security_event?
Java/KotlinDatExceptione.codee.retrye.securityEvent
C#DatExceptione.Codee.Retrye.SecurityEvent
C/C++dat_error_tdat_error_code(e)dat_error_retry(e)dat_error_is_security_event(e)
CMS サーバーJSON エンベロープcode フィールド

セキュリティイベント は偽造・改ざんが確定的な 2 件 (DAT_SIG_MISMATCHDAT_CRYPTO_TAG_MISMATCH) だけが true を返します。本ドキュメントの 疑い タグはそれより広い範囲 (改ざんされたトークン・鍵・リクエストまで) を指し、いまのところドキュメント上の分類であってクライアント API としては公開していません。

影響 の等級も同様にドキュメント上の分類です。同じコードでもどこで発生したかによって打撃が変わるためです — 例えば DAT_KEY_INVALID は届いたトークンを弾く場面では影響がありませんが、CMS 同期の途中で証明書を読んでいて出た場合は同期が丸ごと失敗します。

下位の原因は捨てられません。 DAT_MANAGER_NO_ISSUABLE_CERTIFICATEDAT_CMS_IMPORT_FAILED は、各言語の例外チェーン (cause / __cause__ / InnerException / Unwrap()) で理由を伝えます。

C/C++ は整数値も維持します

dat_error_t の既存の整数値は ABI 互換のためそのまま残しますが、文字コードが正本です。ライブラリはもう以前の値を返さないため、err == DAT_ERROR_INVALID_DAT のような比較は一致しません。dat_error_code(e) で照合してください。

C には例外チェーンがないため、理由は dat_manager_issuable_cause() で別途取得します。