DAT 証明書

1. 概要

DAT 証明書は、DAT の発行権限を制御し、トークンの署名および暗号化アルゴリズムとキー (Key) 情報を管理するための仕様です。

各証明書は固有の ID (CID) を持ち、DAT の発行可能期間および生成されるトークンの有効期間 (TTL) を強制することで、トークンのライフサイクルを安全に管理します。

DAT においてキーローリングは選択ではありません。 証明書に発行可能期間が仕様のレベルで埋め込まれているため、期間を過ぎるとその証明書では新しいトークンを作れません。


2. 証明書の構造

証明書のワイヤーフォーマット
cid
uint64 (16進)
.
start
uint64 (10進)
.
duration
uint64 (10進)
.
ttl
uint64 (10進)
.
sig-alg
String
.
crypto-alg
String
.
sig-key
Base64Url
.
crypto-key
Base64Url
各フィールドにマウスを乗せると説明が表示されます。
cid . start . duration . ttl . sig-alg . crypto-alg . sig-key . crypto-key
構造
サンプルrefresh

2.1. フィールド別詳細仕様

CID : Hex (uint64)

  • 証明書を識別する固有の証明書 ID です。DAT の CID フィールドとマッピングされ、検証時にどの証明書を使用するかを決定します。
  • CID は不変の識別子です。 キーを交換する際は同じ CID を再利用せず、新しい CID で証明書を発行します。

DAT発行開始時間 : uint64 (Unix Time)

  • 該当の証明書を使用して DAT を発行できる開始時刻を秒 (Seconds) 単位で表します。

DAT発行期間 : uint64 (Seconds)

  • 証明書の発行有効期間です。DAT発行開始時間から本期間 (秒) が経過した後は、この証明書で新しい DAT を発行することはできません。
  • 絶対時刻ではなく期間 (duration) です。 終了時刻は start + duration で計算されます。

DAT TTL (有効時間) : uint64 (Seconds)

  • この証明書で発行される DAT の有効期間 (Time To Live) です。DAT 生成時の expire 値は、発行時刻にこの値を加算して設定されます。

署名アルゴリズム : String / Enum

  • DAT の signature フィールドを生成および検証する際に使用する署名アルゴリズムです。

暗号化アルゴリズム : String / Enum

  • DAT の secure フィールドを暗号化および復号する際に使用する暗号化アルゴリズムです。

署名キー : Base64Url (Binary)

  • 署名および検証に使用されるキーデータです。(アルゴリズムに応じて、非対称鍵の Public/Private Key または対称鍵となります。)

暗号化キー : Base64Url (Binary)

  • secure フィールドの暗号化・復号に使用される暗号化キーデータです。

2.2. 時間の計算

end    = start + duration        発行終了時刻
expire = end + ttl               証明書の最終失効時刻
  • すべての計算は uint64 上で行い、オーバーフローのみをエラーとして拒否します。
  • duration = 0ttl = 0正当な値です。発行ウィンドウがただちに閉じる証明書や、失効と同時に無効になるトークンを作る証明書を表現できます。
  • フィールドがすべて符号なし整数であるため、負の値は型として存在しません。

2.3. コンストラクタのシグネチャ

すべての言語実装が以下の引数順序を使用します。

(cid, dat_issuance_start_seconds, dat_issuance_duration_seconds, dat_ttl_seconds,
 signature_key, crypto_key)

3 番目の引数は終了時刻ではなく期間です

3 番目の引数に絶対的な終了時刻 (end) を渡すと、エラーにならずにまったく違う有効ウィンドウを持つ証明書が作られます。値がそのまま start + duration に入るためです。


3. 証明書のライフサイクル

証明書の 4 つの区間
生成
発行開始
発行終了
最終失効
発行遅延 (delay)
発行可能 (duration)
DAT TTL
すべてのノードが証明書を取得するための時間
DAT の発行・検証がいずれも可能
発行は不可、検証のみ可能
証明書は発行遅延 → 発行可能 → DAT TTL の残余区間をすべて過ぎた後で、ようやく最終的に失効します。
区間発行検証判定
発行遅延issuable() == false
発行可能issuable() == true
DAT TTL 残余発行ウィンドウは閉じているが失効前
最終失効以降expired() == true
  • 発行可能かどうかsignable() && start <= now <= end で判定し、両端を含みます
  • 発行ウィンドウが閉じた後も、証明書は ttl の分だけさらに生き続けます。ウィンドウが閉じる直前に発行されたトークンが自らの寿命を全うできる必要があるからです。
  • 発行遅延 (delay) の区間は、クラスタ内のすべてのノードが新しい証明書を取得する時間を確保するためのものです。詳細は CMS 同期 のドキュメントを参照してください。

4. アルゴリズム

4.1. 署名アルゴリズム

DAT の改ざんを防止するための署名アルゴリズムの一覧です。対称鍵方式と非対称鍵方式をサポートしています。

名称方式備考
ECDSA-P256非対称楕円曲線デジタル署名 (NIST secp256r1)
ECDSA-P384非対称楕円曲線デジタル署名 (NIST secp384r1)
ECDSA-P521非対称楕円曲線デジタル署名 (NIST secp521r1)
HMAC-SHA256-MFS対称256-bit 固定サイズ秘密鍵ベースの Keyed-Hashing
HMAC-SHA384-MFS対称384-bit 固定サイズ秘密鍵ベースの Keyed-Hashing
HMAC-SHA512-MFS対称512-bit 固定サイズ秘密鍵ベースの Keyed-Hashing

MFS (Maximum Fixed Secret): ハッシュアルゴリズムの出力 (Output) サイズと同じビット数の固定サイズ秘密鍵を使用する方式です。

4.2. 暗号化アルゴリズム

DAT 内部の機密データ (secure フィールド) を保護するための認証付き暗号化 (Authenticated Encryption) アルゴリズムの一覧です。

名称キー長構造
IV-AES128-GCM128-bitIV(96bit) + 暗号化結果
IV-AES256-GCM256-bitIV(96bit) + 暗号化結果

IV (Initialization Vector) の内在化: 暗号化のたびに生成される固有の 96 ビットの NONCE (IV) が、暗号化結果の先頭に接頭辞 (Prefix) として結合されます。復号時には先頭の 96 ビットを IV として分離し、復号を行います。

4.3. キー長の検証

証明書を読み込む際に、宣言されたアルゴリズムのビット数と実際のキー長が一致するかを確認します。

たとえば IV-AES256-GCM と宣言された証明書に 16 バイトのキーが入っていた場合、インポート自体が拒否されます。この検査がないと、AES-256 を使っているつもりで実際には AES-128 で動作してしまいます。


5. verify-only エクスポート

検証のみを行うサーバーには、署名用の秘密鍵を渡す必要がありません。DAT 証明書はそのために verify-only エクスポートを提供します。

完全な証明書と verify-only 証明書の配布経路
DAT CMS
発行サーバー
検証専用サーバー
GET /v1/certs
完全な証明書 (署名用秘密鍵を含む)
GET /v1/certs/verify-only
verify-only 証明書
リクエスト証明書の配布
署名アルゴリズムsupport_verify_only()verify-only エクスポートの結果
ECDSAtrue署名キーは公開鍵のみが出力されます (Base64 130 文字 → 87 文字)
HMACfalse明示的なエラーが発生します

HMAC は対称鍵であるため、「検証だけができるキー」というものが存在しません。したがって verify-only エクスポートを試みた場合、黙ってスキップするのではなくエラーとして即座に通知します。 HMAC 証明書が混ざった状態で verify-only エクスポートを呼び出すと失敗するため、検証専用ノードを運用するのであれば ECDSA 系を使用する必要があります。

暗号化キーは verify-only でも全体が出力されます

secure フィールド用の AES キーは対称鍵であるため、verify-only かどうかにかかわらず常に全体がエクスポートされます。 復号するには暗号化に使ったものと同じキーが必要だからです。

つまり verify-only 証明書を受け取ったサーバーは:

  • 署名を偽造できません — 秘密鍵がないため新しい DAT を作れません。
  • secure ペイロードは復号できます — そのサーバーに対する機密性は提供されません。

verify-only は発行権限を分けるための仕組みであって、機密性を分けるための仕組みではありません。検証ノードに隠すべき値であれば、secure に入れてはいけません。