エラーコード
DAT が公式にサポートするサービスライブラリ共通のエラーコードです。
各コードには 影響・リトライ の 2 つの値が付き、一部にはさらに 疑い のタグが付きます。
影響 — サービスが受ける打撃
アラートを設定する基準です。「いまサービスが止まっているか」だけを見ます。
| 影響 | 意味 | 例 |
|---|---|---|
| 致命的 | サービスまたは特定機能が停止します。 発行不可、同期の恒久的な失敗、初期化の失敗 | 発行サーバーに使える証明書が 1 枚もない |
| 部分的 | 一部のリクエストやサイクルは失敗しますが、サービスは動き続けます。多くは自力で回復します | CMS の 1 サイクルが失敗。既存の証明書で動作継続 |
| 影響なし | リクエストを 1 件拒否して終わりです | 改ざんされたトークンが届いた。弾けばそれで済む |
影響なし はアラートの対象ではありません。不正な入力が 1 件来ただけで担当者全員が確認しなければならないなら、アラートは意味を失います。
疑い — 続くようなら調査
疑い タグが付いたコードは、1 件だけなら通常運用の一部です。クライアントはいつでも不正な値を送ってくる可能性があり、それを弾くのがライブラリ本来の役目です。
ただしこうしたエラーが継続的に、あるいは特定の発信元からまとまって発生する場合は、次の 2 つのどちらかです。
- 設定の異常 — デプロイが誤っている、旧バージョンのクライアントが残っている、証明書が食い違っている。
- 攻撃の試み — トークンや鍵を改ざんして検証を通そうとしている、あるいは有効な値を探る探索行為。
そのためこれらのコードは 件数をメトリクスとして取っておくのが正解です。しきい値を超えたときだけ通知すれば十分です。
リトライ
| リトライ | 意味 |
|---|---|
| 一時的 | バックオフしてリトライすれば解消します |
| 恒久的 | リトライ禁止。設定や入力を直す必要があります |
| 状態 | エラーではなくシグナルです |
トークン
受け取ったトークン文字列そのものの問題です。
DAT_TOKEN_MALFORMED ドット区切りのパートが 5 個でない、expire が純粋な 10 進数でない、cid が純粋な 16 進数でない、plain・secure が base64url でない、数値フィールドが整数の表現範囲を超えた、のいずれかです。
arrow_forwardリクエストを拒否
DAT_TOKEN_EXPIREDexpire <= now。同時刻でも期限切れです — expire == now はすでに期限切れとみなします。
arrow_forwardトークンの再発行を促す
DAT_TOKEN_UNKNOWN上のいずれにも分類されないトークンエラーです。
arrow_forwardログを確認
期限切れと形式エラーは必ず区別します
対応が正反対です — 期限切れは正常な寿命の終わりなのでトークンを更新させればよく、形式エラーのトークンはそもそも発行されたものではないため、拒否すべきです。
パースはまず構造を確定してから値を見ます。"1.2.3" のようにパートが足りない文字列は、期限切れのトークンではなくそもそもトークンではないため DAT_TOKEN_MALFORMED です。
expire フィールドが +100 のように符号付きの場合も、期限切れではなく形式エラーです。純粋な ASCII 数字だけを受け付けます。
証明書
証明書文字列の形式、およびその証明書がいま使えるかどうかの問題です。
DAT_CERT_MALFORMED ドット区切りのパートが 8 個でない、cid・start・duration・ttl のパースに失敗した、鍵フィールドが base64url でない、start + duration + ttl が u64 を超えた、のいずれかです。
arrow_forward証明書を再配布
DAT_CERT_EXPIREDstart + duration + ttl < now。発行も検証もできない完全な期限切れ状態です。
arrow_forward証明書を更新
DAT_CERT_NOT_YET_ISSUABLEnow < start。発行ウィンドウがまだ開いていません。
arrow_forward待機
DAT_CERT_ISSUANCE_ENDEDnow > start + duration ですが ttl は残っています。発行はできず、検証のみ可能です。
arrow_forward新しい証明書を配布
DAT_CERT_VERIFY_ONLY署名用秘密鍵を持たず、公開鍵だけが入った証明書です。検証はできますが発行はできません。
arrow_forward配布設定を確認
DAT_CERT_NOT_FOUND トークンの 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_FOUND と DAT_CERT_NOT_SYNCED は外から見た症状は同じですが、対応が異なります。前者はそもそも発行されていない cid なので待っても現れず、後者は同期さえ済めば解消します。
DAT_CERT_NOT_FOUND は 1 件なら弾くだけで済みますが、急に増えた場合は配布が食い違っているか、偽造トークンが出回っているという意味です。
署名
DAT_SIG_MISMATCH署名検証が不一致で終わりました。HMAC の値が異なるか、ECDSA verify が false です。
arrow_forwardセッションを遮断、セキュリティログへ
DAT_SIG_MALFORMED 署名パートが空、base64url でない、ECDSA の r‖s 長が曲線と合わない、DER 変換に失敗した、のいずれかです。
arrow_forwardリクエストを拒否
DAT_SIG_KEY_MISSINGverify-only の鍵で署名しようとしました。実行時に秘密鍵が存在しない状態です。
arrow_forward発行サーバーの設定を確認
DAT_SIG_BACKEND署名・検証の演算そのものが実行できませんでした。誤った鍵の型、解放済みのハンドル、暗号ライブラリの内部エラーです。
arrow_forward鍵の型とライブラリを確認
DAT_SIG_UNKNOWN上のいずれにも分類されない署名エラーです。
arrow_forwardログを確認
不一致とバックエンド障害を混ぜないでください
2 つのコードは軸が正反対です。
DAT_SIG_MISMATCH— 届いた署名が合わなかっただけなのでサービスへの影響はなく、代わりに続くようなら 疑い の対象です。DAT_SIG_BACKEND— 検証の演算自体が回らなかったので実装側の問題であり、疑いの対象ではありません。
誤った鍵の型やライブラリのバグを「署名不一致」として報告すると、実際には実装側が壊れている状況が攻撃指標に混ざり込みます。逆に本物の偽造がバックエンドエラーに分類されると、疑いの指標から丸ごと抜け落ちます。
暗号化
secure ペイロードの暗号化・復号の問題です。
DAT_CRYPTO_TAG_MISMATCHAES-GCM の認証タグが一致しません。secure が改ざんされたか、証明書の鍵が異なります。
arrow_forwardセッションを遮断、セキュリティログへ
DAT_CRYPTO_DATA_INVALID 暗号文が空ではないのに 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 宣言したアルゴリズムと鍵長が一致しない (HMAC 32/48/64、AES 16/32)、曲線上にない点である、d ∉ [1,n-1] である、非圧縮 (0x04) 形式でない、秘密鍵と公開鍵が対になっていない、のいずれかです。
arrow_forward鍵を交換
DAT_KEY_VERIFY_ONLY_UNSUPPORTEDHMAC 系に対して 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-P256、IV-AES256-GCM) と正確に一致する必要があります。
arrow_forwardアルゴリズム名を確認
DAT_CONFIG_ARGUMENT_INVALID 必須の引数が null、許容範囲外 (負の時間値、interval <= 0)、サポートされない型 (動的型付け言語で payload に数値やブール値を渡した)、署名対象の body が空、のいずれかです。
arrow_forward呼び出しコードを修正
DAT_CONFIG_URI_INVALIDCMS サーバーの 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_UNREACHABLEDNS 失敗、接続拒否、TLS 失敗、タイムアウトです。タイムアウトは別コードではなくここに含まれます — 対応が同じだからです。
arrow_forwardバックオフ後にリトライ
DAT_CMS_UNAUTHORIZEDサーバーが 401 で応答しました。トークンがないか誤っています。
arrow_forwardトークン設定を確認
DAT_CMS_FORBIDDENサーバーが 403 で応答しました。トークンは有効ですが、このエンドポイントの権限がありません。
arrow_forwardトークンの等級を確認
DAT_CMS_ENDPOINT_NOT_FOUNDサーバーが 404 で応答しました。URL が誤っています。
arrow_forwardURL 設定を確認
DAT_CMS_SERVER_ERRORサーバーが 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サーバーがクライアントより古い version を返しました。全体の再同期の指示です。
arrow_forward自動的に処理されます
DAT_CMS_NOT_SYNCEDまだ一度も同期に成功していない状態です。
arrow_forward初回同期を待つ
DAT_CMS_SYNC_IN_PROGRESS前回の同期がまだ動いているため、今回のサイクルをスキップしました。エラーではありません。
DAT_CMS_NOT_SUPPORTEDCMS 機能がビルドに含まれていません。feature が無効か、CURL が同梱されていません。
arrow_forwardビルドオプションを確認
DAT_CMS_UNKNOWN上のいずれにも分類されない CMS エラーです。
arrow_forwardログを確認
同期が恒久的な失敗と判定されるコード (UNAUTHORIZED・FORBIDDEN・ENDPOINT_NOT_FOUND・MALFORMED・IMPORT_FAILED) はすべて致命的です。リトライしても解消しないまま証明書は期限切れになり続けるため、放置すればサービスは必ず止まります。
逆に UNREACHABLE・SERVER_ERROR は部分的です。既存の証明書で動作を続け、次のサイクルで自力回復します — ただし失敗し続ければ最終的には致命に移ります。 連続失敗回数を基準にアラートを設定してください。
同期の失敗は例外として投げられません
初回の同期に失敗してもマネージャーは正常に返されます — 遅れてでも同期されるほうがよいからです。代わりに失敗は参照可能な状態として残ります。
| クライアント | 参照方法 |
|---|---|
| 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) |
一度も成功していなければ DAT_CMS_NOT_SYNCED、正常なら空です。
サーバー
CMS サーバーが出すコードです。クライアントはこれらのコードを生成せず、受け取るだけです。
DAT_AUTH_UNAUTHORIZEDAuthorization ヘッダがないか、トークンがどの等級にも登録されていません。
DAT_AUTH_FORBIDDENトークンは登録されていますが、このエンドポイントが要求する等級ではありません。
DAT_AUTH_DISABLEDトークンが 1 つも設定されておらず、認証が丸ごと無効です。証明書発行 API まで認証なしで開いています。レスポンスとしては返らず、起動ログにのみ出力されます。
arrow_forwardただちにトークンを設定
DAT_REQ_MALFORMEDパスやクエリのパラメータを解釈できないか、引数が許容範囲外 (負の delay、10 年超など) です。
DAT_REQ_ALG_UNSUPPORTEDリクエストパスのアルゴリズム名が未知です。
DAT_REQ_NOT_FOUNDそのようなルートがないか、メソッドが異なります。
DAT_REQ_TOO_LARGEリクエストボディのサイズが上限を超えました。
DAT_REQ_UNKNOWN上のいずれにも分類されないリクエストエラーです。
DAT_STORE_UNAVAILABLEDB 接続の切断、コネクションプールの枯渇、ロック競合、タイムアウトです。503 を使う唯一のコードであり、クライアントが「これは待てば直る」と判断できる唯一のシグナルです。
arrow_forwardバックオフ後にリトライ
DAT_STORE_UNKNOWN参照・書き込みの失敗、テーブルの不在、スキーマの不一致、保存された証明書行の破損です。
arrow_forwardDB の状態を確認
レスポンスのエンベロープ:
{
"code": "DAT_REQ_ALG_UNSUPPORTED",
"details": { "algorithm": "BOGUS-ALG" }
}証明書を生成・処理する過程で出るエラーは、サーバーも上記の共通コード (DAT_CERT_*、DAT_KEY_*、DAT_CONFIG_*) をそのまま使います。
サーバーのコードを受け取ったら
クライアントはサーバーのコードを自身の CMS コードで包み、元のコードは cause に保存します。
| 受け取ったもの | HTTP | クライアントが出すコード |
|---|---|---|
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_* (その他) | 400·405·413 | DAT_CMS_HTTP_STATUS |
DAT_STORE_UNAVAILABLE | 503 | DAT_CMS_SERVER_ERROR |
DAT_STORE_UNKNOWN | 500 | DAT_CMS_SERVER_ERROR |
| (version の巻き戻し) | 200 | DAT_CMS_VERSION_RESET |
症状から探す
| 症状 | コード |
|---|---|
| ログイン直後は通るのに、しばらくすると拒否される | DAT_TOKEN_EXPIRED — トークンの寿命が尽きました。再発行すれば済みます |
| 特定のサーバーだけ検証に失敗する | DAT_CERT_NOT_SYNCED — そのサーバーがまだ新しい CID を受け取っていません |
| すべてのサーバーで同じトークンが拒否される | DAT_CERT_NOT_FOUND — 発行された記録のない CID です |
| 発行サーバーがトークンを作れない | DAT_MANAGER_NO_ISSUABLE_CERTIFICATE + DAT_CERT_VERIFY_ONLY — verify-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_MALFORMEDとDAT_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_ |
クライアント別のアクセス方法
| クライアント | エラー型 | コード | リトライ分類 | セキュリティイベント |
|---|---|---|---|---|
| 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) |
| CMS サーバー | JSON エンベロープ | code フィールド | — | — |
セキュリティイベント は偽造・改ざんが確定的な 2 件 (DAT_SIG_MISMATCH、DAT_CRYPTO_TAG_MISMATCH) だけが true を返します。本ドキュメントの 疑い タグはそれより広い範囲 (改ざんされたトークン・鍵・リクエストまで) を指し、いまのところドキュメント上の分類であってクライアント API としては公開していません。
影響 の等級も同様にドキュメント上の分類です。同じコードでもどこで発生したかによって打撃が変わるためです — 例えば DAT_KEY_INVALID は届いたトークンを弾く場面では影響がありませんが、CMS 同期の途中で証明書を読んでいて出た場合は同期が丸ごと失敗します。
下位の原因は捨てられません。 DAT_MANAGER_NO_ISSUABLE_CERTIFICATE と DAT_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() で別途取得します。