DAT 証明書
1. 概要
DAT 証明書は、DAT の発行権限を制御し、トークンの署名および暗号化アルゴリズムとキー (Key) 情報を管理するための仕様です。
各証明書は固有の ID (CID) を持ち、DAT の発行可能期間および生成されるトークンの有効期間 (TTL) を強制することで、トークンのライフサイクルを安全に管理します。
DAT においてキーローリングは選択ではありません。 証明書に発行可能期間が仕様のレベルで埋め込まれているため、期間を過ぎるとその証明書では新しいトークンを作れません。
2. 証明書の構造
cid . start . duration . ttl . sig-alg . crypto-alg . sig-key . crypto-key2.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 = 0、ttl = 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. 証明書のライフサイクル
| 区間 | 発行 | 検証 | 判定 |
|---|---|---|---|
| 発行遅延 | ✕ | ○ | 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-GCM | 128-bit | IV(96bit) + 暗号化結果 |
IV-AES256-GCM | 256-bit | IV(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 エクスポートを提供します。
| 署名アルゴリズム | support_verify_only() | verify-only エクスポートの結果 |
|---|---|---|
| ECDSA 系 | true | 署名キーは公開鍵のみが出力されます (Base64 130 文字 → 87 文字) |
| HMAC 系 | false | 明示的なエラーが発生します |
HMAC は対称鍵であるため、「検証だけができるキー」というものが存在しません。したがって verify-only エクスポートを試みた場合、黙ってスキップするのではなくエラーとして即座に通知します。 HMAC 証明書が混ざった状態で verify-only エクスポートを呼び出すと失敗するため、検証専用ノードを運用するのであれば ECDSA 系を使用する必要があります。
暗号化キーは verify-only でも全体が出力されます
secure フィールド用の AES キーは対称鍵であるため、verify-only かどうかにかかわらず常に全体がエクスポートされます。 復号するには暗号化に使ったものと同じキーが必要だからです。
つまり verify-only 証明書を受け取ったサーバーは:
- 署名を偽造できません — 秘密鍵がないため新しい DAT を作れません。
secureペイロードは復号できます — そのサーバーに対する機密性は提供されません。
verify-only は発行権限を分けるための仕組みであって、機密性を分けるための仕組みではありません。検証ノードに隠すべき値であれば、secure に入れてはいけません。