分散型識別子解決(DID Resolution)v0.3

DIDの解決およびDID URLの参照解決のためのアルゴリズムとガイドライン

W3C作業草案

この文書に関する詳細
このバージョン:
https://www.w3.org/TR/2026/WD-did-resolution-20260710/
最新公開バージョン:
https://www.w3.org/TR/did-resolution/
最新編集者草案:
https://w3c.github.io/did-resolution/
履歴:
https://www.w3.org/standards/history/did-resolution/
コミット履歴
編集者:
Markus Sabadello (Danube Tech), 2025年12月10日まで
Dmitri Zagidulin (MIT DCC)
Stephen Curran (Cloud Compass Computing Inc.)
Joe Andrieu (Legendary Requirements)
著者:
Markus Sabadello (Danube Tech)
Dmitri Zagidulin (MIT DCC)
フィードバック:
GitHub w3c/did-resolution (プルリクエスト, 新しい課題, 未解決の課題)
public-did-wg@w3.org 宛てに、件名を[did-resolution] … メッセージのトピック …として送信(アーカイブ

概要

分散型識別子(DID)の解決とは、特定のDIDについてDID 文書および付随するメタデータを取得するプロセスである。このプロセスはDID と一連の解決オプションを入力として受け取り、DID文書と、解決された文書および 解決要求に関する関連メタデータを返す。解決済みDID文書は、DID主体との 暗号学的に検証可能なやり取りを可能にする情報の集合であり、暗号学的公開鍵 などの仕組みを含む。本仕様は、DID解決に使用されるアルゴリズムおよび ガイドラインを扱い、基礎となるDIDアーキテクチャを詳細に説明する中核DID 仕様であるDecentralized Identifiers (DIDs) v1.0に依存している。

この文書のステータス

この節では、この 文書の公開時点におけるステータスを説明する。現在のW3C 公開文書およびこの技術報告書の最新改訂版の一覧は、 W3C標準および草案 索引で確認できる。

この文書に関するコメントを歓迎する。課題は GitHubで直接提出するか、 public-did-wg@w3.org宛てに送信してほしい (購読, アーカイブ)。

(リスクのある機能)課題 1

DID URL 逆参照機能の定義は、 現在、 リスクありとされており、 仕様から変更または削除される可能性があります。 ワーキンググループは、この仕様で定義されている当該機能の 価値について、実装者からのフィードバックを求めています。

本仕様に関する作業の一部は、米国国土安全保障省の科学技術局により、 契約HSHQDC-17-C-00019の下で資金提供された。本仕様の内容は、 必ずしも米国政府の立場または政策を反映するものではなく、公式な 承認を推測してはならない。

本仕様に関する作業は、Christopher Allen、Shannon Appelcline、Kiara Robles、Brian Weller、Betty Dhamers、Kaliya Young、Kim Hamilton Duffy、Manu Sporny、Drummond Reed、Joe Andrieu、およびHeather Vescentが支援した Rebooting the Web of Trustコミュニティによっても支援されている。

この文書は、Decentralized Identifier Working Groupにより、 勧告 トラックを用いた 作業草案として公開された。

作業草案としての公開は、W3Cおよびその 会員による承認を意味するものではない。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止 される可能性がある。この文書を進行中の作業以外のものとして引用することは 適切ではない。

この文書は、 W3C 特許 ポリシーの下で活動する グループによって作成された。 W3Cは、このグループの成果物に関連して行われた 特許開示の公開一覧を 維持している。そのページには、特許を開示するための 手順も含まれている。ある個人が、その個人の信じるところでは 必須クレームを含む 特許を実際に認識している場合、その情報を W3C特許ポリシー第6節に従って開示しなければならない。

この文書は、 2025年8月18日版W3Cプロセス文書に準拠している。

1. はじめに

DID解決とは、指定されたDID 文書 を、指定されたDIDについて取得する プロセスである。これは任意のDIDに対して実行できる4つの必須 操作の1つ("Read"。他は "Create"、"Update"、"Deactivate")である。これらの操作の詳細は、 DID メソッドによって異なる。DID解決の上に構築されるDID URL参照解決とは、 指定されたDID URLについて、リソースの 表現を取得するプロセスである。これらのプロセスを実行できる ソフトウェアおよび/またはハードウェアは、 DIDリゾルバーと呼ばれる。

本仕様は、特定のDIDメソッドの "Resolve"操作(DIDリゾルバー が対応するもの)に依存せず、クライアントが DID解決およびDID URL 参照解決要求を実行するために使用できる標準インターフェイスを定義する。 さらに本仕様は、DIDリゾルバーまたはDID URL 参照解決器の実装に関連する要件、 入力および結果を含むアルゴリズム、アーキテクチャ上の選択肢、 ならびに各種のセキュリティおよびプライバシー上の考慮事項を定義する。

本仕様はDID 解決の基本レベルの機能をいくつか定義するが、DIDの 検証可能データ レジストリと通信するために実際に必要となる手順は、適用される DIDメソッド仕様によって定義されることに注意すること。

1.1 実装者向け概要

この節は非規範的である。

標準のresolve(did, resolutionOptions)インターフェイス( DID解決の節で定義)を用いてDID リゾルバーを呼び出すことで、DID文書 および付随するメタデータ(例: contentType、証明、バージョニング)を取得できる。 アプリケーションはこれを用いて、ユーザーの暗号鍵、サービスエンドポイント、 または状態を検証できる。

たとえば、過去のある時点におけるDID did:example:123の状態を取得するには、 クライアントアプリケーションは、次のように versionTime解決オプションを指定してDIDを解決できる。
resolve("did:example:123", {"versionTime":"2021-05-10T17:00:00Z"}) また、クライアントは did:example:123?service=files&relativeRef=/resume.pdf のようなDID URLを参照解決し (詳細な例はこちらを参照)、 DID文書で宣言されたサービスを介して保存されているユーザーの履歴書を取得できる。

さらに、本仕様のDID URL参照解決アルゴリズムは、 クライアントがフラグメント(例: #key-1)をたどって、 DID文書から 特定の検証メソッドを抽出する方法を示している (詳細な例はこちらを参照)。 実際には、実装者は DID Resolution Test Suite に対してリゾルバーを検証する。このテストスイートは、規範的なMUSTおよびエラー条件 (無効なDID、無効化されたDID、未対応のメソッド、相対URL展開など)を実行し、 クライアントアプリケーションが異なるDIDメソッド間でも正しい解決動作に 確実に依存できるようにする。

1.2 適合性

非規範的であると示された節に加えて、本仕様内のすべての作成ガイドライン、図、例、および注記は非規範的である。それ以外の本仕様内のすべては規範的である。

この文書におけるキーワードMAYMUSTMUST NOTNOT REQUIREDOPTIONALRECOMMENDEDREQUIRED、およびSHOULDは、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] で説明されているとおりに解釈される。

適合DIDリゾルバーとは、 4. DID 解決における 関連する規範的記述に準拠する、ソフトウェアおよび/またはハードウェアとして実現された任意の アルゴリズムである。

適合ネットワークベースDIDリゾルバー とは、適合DIDリゾルバーであって、さらに 12.1 HTTP(S)バインディングの 規範的記述にも準拠するものである。

適合DID URL参照解決器とは、 5. DID URL参照解決における 関連する規範的記述に準拠する、ソフトウェアおよび/またはハードウェアとして実現された任意の アルゴリズムである。

適合ネットワークベースDID URL参照解決器 とは、適合DID URL参照解決器であって、 さらに12.1 HTTP(S)バインディングの規範的記述に 準拠するものである。

1.3 対象読者

この節は非規範的である。

本仕様には、主に3種類の対象読者がいる。適合DID メソッドの実装者、適合DIDリゾルバーの実装者、そしてDIDリゾルバーを使用して DIDを解決したいシステムおよびサービスの実装者である。意図される 対象読者には、ソフトウェアアーキテクト、データモデラー、 アプリケーション開発者、サービス開発者、テスター、運用者、およびユーザー 体験(UX)専門家が含まれるが、これらに限定されない。分散型アイデンティティ、 検証可能クレデンシャル、および安全なストレージに関連する広範な標準化作業に 関わる他の人々も、本仕様の読者として関心を持つ可能性がある。

1.4 ユースケース

この節は非規範的である。

DID解決仕様は、特定のDIDのDIDメソッドに依存せずにDIDを解決しDID URLを参照解決する標準化されたインターフェイスを定義することで、幅広い ユースケースを支援することを意図している。これらのユースケースには 次が含まれる。

2. 用語

この節では、本仕様および 分散型識別子 インフラストラクチャ全体で使用される用語を定義する。これらの用語が本仕様に現れる場合には、 その用語へのリンクが含まれる。

バインディング
クライアントDIDリゾルバーを呼び出すための具体的な仕組みである。これは、ローカルのコマンドラインツールまたはライブラリ APIなどのローカルバインディング、またはリモートバインディング(たとえばHTTP(S)バインディング)であり得る。8.2 リゾルバーアーキテクチャの節を参照。
クライアント
DID 解決および/またはDID URL参照解決 アルゴリズムを実行するために、DIDリゾルバーを呼び出す ソフトウェアおよび/またはハードウェア。この呼び出しはバインディングを介して行われる。クライアントという用語は、特定の ネットワークトポロジを意味しない。
DID解決結果
DID解決アルゴリズムの結果を表すデータ構造。 DID 文書を含む場合がある。9. DID解決結果の節を参照。
DID URL参照解決結果
DID URL参照解決 アルゴリズムの結果を表すデータ構造。 DID 文書またはその他のコンテンツを含む場合がある。10. DID URL参照解決結果の節を参照。
リソース
[RFC3986]で定義されるとおり、"...the term 'resource' is used in a general sense for whatever might be identified by a URI." 同様に、任意のリソースは DIDによって識別される DID主体 として機能し得る。
表現
HTTPについて[RFC9110]で定義されるとおり、"information that is intended to reflect a past, current, or desired state of a given resource, in a format that can be readily communicated via the protocol. A representation consists of a set of representation metadata and a potentially unbounded stream of representation data." DID 文書は、 DID主体を記述する情報の表現である。 Decentralized Identifiers (DIDs) v1.0を参照。
ローカルバインディング
バインディングのうち、クライアントが同じ ネットワークホスト上で実行されているDIDリゾルバーを呼び出すもの。 たとえば、ローカルコマンドラインツールまたはライブラリAPIを介したものがある。 この場合、DIDリゾルバーは "ローカルDID リゾルバー"とも呼ばれる。 8.2 リゾルバー アーキテクチャの節を参照。
リモートバインディング
バインディングのうち、クライアントが異なる ネットワークホスト上で実行されているDIDリゾルバーを呼び出すもの。 たとえば、HTTP(S)バインディングを介したものがある。 この場合、DIDリゾルバーは "リモートDIDリゾルバー"とも呼ばれる。 8.2 リゾルバー アーキテクチャの節を参照。
サービス
1つ以上のDIDサービスエンドポイントを介して、 DID主体または 関連エンティティと通信または相互作用するための手段。 例には、発見サービス、エージェントサービス、ソーシャルネットワーキング サービス、ファイルストレージサービス、および検証可能クレデンシャルリポジトリサービスが含まれる。
検証不能解決
DIDメソッドの"Resolve"操作の低信頼実装であり、 DIDリゾルバー検証可能データ レジストリとの間で実行され、DID文書を取得する。 結果の完全性および正確性についての保証はない。8.1 メソッド アーキテクチャの節を参照。
検証 メソッド

証明を独立して検証するプロセスと併せて使用できるパラメーターの集合。 たとえば、暗号学的公開鍵は、デジタル署名に関する検証メソッドとして使用できる。 そのような使用では、署名者が関連する暗号学的秘密鍵を保有していたことを検証する。

この定義における"検証"および"証明"は、広く適用されることを意図している。 たとえば、暗号学的公開鍵は、Diffie-Hellman鍵交換の間に、暗号化のための 共有対称鍵を合意するために使用されることがある。これは鍵合意プロセスの 完全性を保証する。したがって、プロセスの説明で "検証"または"証明"という言葉が使われない場合であっても、これも別種の検証 メソッドである。

検証可能解決
DIDメソッドの"Resolve"操作の高信頼実装であり、 DIDリゾルバー検証可能データ レジストリとの間で実行され、DID文書を取得する。 適用されるDID メソッドの下で可能な範囲において、 結果の完全性および正確性についての保証がある。 8.1 メソッド アーキテクチャの節を参照。
汎用一意識別子 (UUID)
[RFC4122]で定義される、グローバルに一意な識別子の一種。UUIDは、 集中型登録機関を必要としないという点でDIDに類似している。UUIDは、 解決可能でも暗号学的に検証可能でもないという点でDIDと異なる。
Uniform Resource Identifier(URI)
[RFC3986]で定義される、 World Wide Web上のすべてのリソースの標準識別子形式。DIDはURI スキームの一種である。

3. DIDパラメーター

DID URL構文は、 パラメーターのための単純な形式をサポートする([DID-CORE]のQuery節を参照)。 DIDパラメーターをDID URLに追加することは、 そのパラメーターがリソースの識別子の一部になることを意味する。

1: 'versionTime' DIDパラメーターを含むDID URL
did:example:123?versionTime=2021-05-10T17:00:00Z
2: 'service'および'relativeRef' DID パラメーターを含むDID URL
did:example:123?service=files&relativeRef=/resume.pdf

存在する各DIDパラメーターについて、その関連値は スカラー値 文字列であり、かつ RFC3987第3.1節に従ってASCIIへシリアライズされたものでMUST

一部のDIDパラメーターは、特定の DIDメソッドから完全に独立しており、 すべてのDIDに対して同じように機能する。 その他のDIDパラメーターは、すべての DIDメソッドでサポートされるわけではない。 任意のパラメーターがサポートされる場合、それらはそれをサポートする DIDメソッド全体で 一様に動作することが期待される。次の表は、すべての DIDメソッド全体で同じように機能する 共通のDIDパラメーターを示す。すべての DIDパラメーターのサポートはOPTIONALである。

パラメーター 名 説明
service サービスIDによって、サービスDID 文書から識別する。
serviceType サービスタイプによって、1つ以上のサービスの集合を DID 文書から識別する。
relativeRef RFC3986第4.2節に従う 相対URI参照であり、 DIDサービスエンドポイント上の リソースを識別する。このDIDサービスエンドポイントは、 serviceパラメーターを使用して DID文書から選択される。
versionId 解決されるべきDID文書 の特定のバージョンを識別する(バージョンIDは連番、または UUID、 またはメソッド固有のものであり得る)。
versionTime 解決されるべき DID 文書の特定のバージョンタイムスタンプを識別する。すなわち、 指定されたversionTimeより前に DIDについて 有効であったDID文書の 最新バージョンである。存在する場合、関連値は 3.1 日時で定義される日時形式で 表現されていなければMUSTならない。

実装者およびDID メソッド仕様の著者は、 ここに列挙されていない追加のDIDパラメーターを使用することがある。最大限の 相互運用性のため、同じDIDパラメーターが異なる意味で使用される場合の衝突を避けるために、 DIDパラメーターはDID Document Properties Extensionsメカニズム[DID-EXTENSIONS-PROPERTIES]を使用することが RECOMMENDEDである。

DID 解決および DID URL 参照解決関数は、 DID 解決オプションまたは DID URL 参照解決オプションDID リゾルバーまたは DID URL デリファレンサーに渡すことによって影響を受ける可能性があります。このような オプションは、DIDまたは DID URLの一部ではありません。これは、 特定のパラメーターを HTTP URL に含めることも、 代わりに参照解決プロセス中に HTTP ヘッダーとして渡すこともできる HTTP に相当します。

3.1 日時

本仕様内のすべての日時値は、 [VC-DATA-MODEL]のVerifiable Credentials Data Model v2.0で定義される有効なXML日時値である ASCII 文字列でなければMUSTならない。 さらに、DID解決で使用されるタイムスタンプは、 秒未満の小数精度を持たずにUTCへ調整されていなければMUSTならない。例: 2020-12-20T19:17:47Z

3.2 クエリの正規化

DID URLのクエリ文字列は、 解決パイプライン全体にわたる複数の独立したコンポーネント — たとえば、クライアント、キャッシュプロキシ、下流 リゾルバー、およびDIDメソッド固有リゾルバー( 8.2 リゾルバー アーキテクチャを参照)— によって日常的に構築、解析、 ログ記録、キャッシュ、および比較される。これらのコンポーネント間で DID URLのクエリ文字列の 正規化が一貫しない場合、誤った解決結果、キャッシュポイズニング、または相互運用性の 破綻を静かに生じさせる可能性がある。この節では、実装者およびDID メソッド仕様の著者が明示的に対処することを推奨されるエッジケースを列挙する。

注記: DID URLクエリ 文字列の正規化

この節の指針は、DID URLのクエリ文字列が解析、比較、および転送の目的で どのように正規化されるかに関するものである。これは、 解決オプションとして渡されるパラメーターと、 DID URLに埋め込まれるパラメーターのどちらであるかという問題とは異なる。 その問題は、3. DIDパラメーターの末尾にある、 DIDパラメーターと解決オプションの区別に関する注記で扱われる。

3.2.1 パーセントエンコーディングの 正規化

この節は非規範的である。

DID URLクエリ 文字列内の文字のパーセントエンコーディングは、識別されているリソースの同一性を 変更しないが、同じ論理値の異なるエンコーディングが、単純な文字列比較を行う実装では 別個の文字列として扱われる可能性がある。

DID URLを比較、キャッシュ、または転送する実装は、比較または保存の前に パーセントエンコーディングを正規化することが推奨される。 RFC3986第6.2.2節: 構文に基づく正規化と 一貫する次の規則が、基準として提案される。

  1. 未予約文字( RFC3986第2.3節: 未予約 文字で定義)に対応する パーセントエンコードされたオクテットは、リテラル文字形式にデコードできる。
  2. 残りのすべてのパーセントエンコードされたオクテットは、大文字の 16進数字を使用して表すのが最善である(例: %2fではなく%2F)。
  3. クエリコンポーネント内の予約区切り文字であるパーセントエンコード文字 (例: &を表す%26=を表す %3D)をデコードしないこと。そうすると クエリ文字列の解析構造が変更されるためである。

DIDメソッド仕様は、メソッド固有のDIDパラメーター内のどの文字が 正規化中に安全にデコードできるかを文書化することが推奨される。

注記: relativeRefのパーセントエンコーディング

relativeRefDIDパラメーター値には通常、パーセントエンコードされた パス区切り文字およびクエリ文字(例: relativeRef=%2Fresume.pdf%3Fversion%3D2)が含まれる。これらは クエリレベルの正規化の一部としてデコードしないこと。エンコードされた形式は意図的であり、 参照解決中にその値を相対参照として正しく解釈するために必要だからである (リソースの参照解決を参照)。

3.2.2 重複パラメーターの 処理

DID URL構文は、 単一のDID URL内で同じクエリパラメーター名が重複して現れることを禁止しない (例: did:example:123?service=files&service=agent)。重複パラメーターが存在する場合の 解決および参照解決関数の動作は、本書ではそれ以外について指定しない。

実装者は、DID URLに重複するクエリ パラメーター名が含まれる場合の実装の動作を定義し文書化することが推奨される。 本仕様で定義されるすべてのDIDパラメーターはスカラー値を持つため (3. DID パラメーターを参照)、これらのパラメーターの重複出現は、 明確に定義された解決動作を持たない曖昧な入力を表す。妥当なアプローチの1つは、 そのようなDID URLを無効として扱い、 INVALID_DID_URLエラーを返すことである (11. エラーを参照)。

メソッド固有のクエリパラメーターを定義するDIDメソッド仕様は、 それらのパラメーターの重複出現が許可されるかどうかを明示的に述べ、 許可される場合には解決の意味論(例: 最初の値が優先、最後の値が優先、集合和)を 定義することが推奨される。

3.2.3 DIDメソッドによる 正準化

3. DIDパラメーターで定義されるクエリパラメーターの集合は 網羅的ではない。DIDメソッドは追加のメソッド固有クエリパラメーターを定義でき、 それらのパラメーターの正準形式(名前、値の形式、および順序を含む)は メソッドによって異なり得る。

DIDメソッド仕様は、定義する任意のメソッド固有クエリパラメーターについて、 次の考慮事項を含む正準形式を指定することが推奨される。

  1. 値の形式: 各パラメーターについて期待されるエンコーディング、文字 集合、および有効な値の範囲。
  2. パラメーター順序: クエリパラメーターの相対順序が意味上の重要性を 持つかどうか、また持つ場合には正準順序が何であるか。明示的な指針がない場合、 論理的同等性のためにDID URLを比較するときは、 パラメーター順序を重要でないものとして扱うのが妥当である。
  3. 大文字小文字の区別: パラメーター名または 値で大文字小文字が区別されるかどうか。本仕様で定義されるパラメーター名は、 大文字小文字を区別するASCII文字列である。DIDメソッド仕様から反対の指針がない場合、 パラメーター値は大文字小文字を区別するものとして扱うのが最善である。

2つのDID URLの論理的同等性をテストする必要がある実装 (たとえばキャッシュ検索のため)は、 3.2.1 パーセントエンコーディングの正規化で説明される パーセントエンコーディングの正規化を適用した後、適用されるDIDメソッド仕様が 意味上の重要性を持つ正準パラメーター順序を定義していない限り、 パラメーター順序に依存しない比較を適用することが推奨される。

4. DID解決

DID解決 関数は、該当するDIDメソッドの "Resolve"操作を使用して、 DIDDID文書に解決する。 これはメソッド操作で説明されている。

DID解決は、 5. DID URL参照解決で 説明されているように、DID URL 参照解決の一部である。

注記

DID URLを参照解決できるようにするには、まず DID文書が必要であり、 それは DID解決 プロセスの結果である。DID 文書は、 DID URL参照解決プロセス中に さまざまな方法で使用される。 DID解決という用語は、 RFC3986第1.2.2節で定義される "URI resolution"と整合している。なぜなら、それは "the appropriate parameters necessary to dereference a URI"を提供するからである。

すべての適合DIDリゾルバーは、以下の関数を実装する。 この関数は次の 抽象形式を持つ。

resolve(did, resolutionOptions) →
   « didResolutionMetadata, didDocument, didDocumentMetadata »

すべての適合DIDリゾルバーは、少なくとも1つの DIDメソッドについて DID解決 関数を実装し、かつ DID文書を返すことができなければ MUSTならない。

適合するDIDリゾルバー 実装は、 この関数のシグネチャをいかなる方法でも変更しない。 DIDリゾルバー 実装は、実際のDID 解決プロセスを実行するために、 resolve関数をメソッド固有の内部関数にマッピングすることがある。 DIDリゾルバー 実装は、ここで指定される resolve関数に加えて、異なるシグネチャを持つ追加の関数を実装し、 公開することがある。

resolve関数の入力変数は次のとおりである。

did
これは解決対象のDIDである。この入力は REQUIREDであり、 その値はDecentralized Identifiers (DIDs) v1.0で定義される 適合DIDでなければ MUSTならない。
resolutionOptions
did自体に加えて、 resolve関数への入力オプションから構成される メタデータ構造である。この構造は 4.1 DID解決 オプションでさらに定義される。この入力はREQUIREDであるが、 構造は空であってもMAYよい。

この関数は複数の値を返し、これらの値をまとめて返す方法には 制限を設けない。 resolveの戻り値は、didResolutionMetadatadidDocument、およびdidDocumentMetadataである。 これらの値については以下で説明する。

didResolutionMetadata
DID解決プロセスの結果に関連する値から構成される メタデータ構造である。この構造は REQUIREDであり、解決プロセスでエラーが発生した場合、 これは空であってはMUST NOTならない。この構造は 4.2 DID解決 メタデータでさらに定義される。解決が成功しなかった場合、 この構造はエラーを記述するerrorプロパティを含まなければ MUSTならない。11. エラーの節を参照。
didDocument
解決が成功した場合、これは Decentralized Identifiers (DIDs) v1.0 仕様の適合する表現のいずれかで 表現可能な DID文書でなければ MUSTならない。解決されたDID 文書内の id の値は、解決されたDIDと文字列として等しくなければ MUSTならない。解決が成功しなかった場合、 この値は空でなければMUSTならない。
didDocumentMetadata
解決が成功した場合、これは メタデータ構造でなければMUSTならない。 この構造は、didDocumentプロパティに含まれる DID文書に関するメタデータを含む。 解決が成功しなかった場合、この出力は空の メタデータ構造でなければMUSTならない。 この構造は4.3 DID文書メタデータでさらに定義される。

4.1 DID解決オプション

これは、DID解決プロセスの 入力オプションを含むメタデータ構造である。

この構造内で可能なプロパティおよびそれらの可能な値は、DID Resolution Extensions [DID-EXTENSIONS-RESOLUTION]に登録されるべき SHOULDである。 本仕様は次の共通入力オプションを定義する。

accept
呼び出し元が選好する DID文書表現のメディアタイプ。 その値は、HTTP Semantics第12.5.1節で定義される Acceptヘッダー値に従って表現されなければ MUSTならない。DIDリゾルバー 実装は、そのような表現が対応され利用可能である場合、 返されるdidDocument表現を 決定するためにこの値を使用すべきSHOULDである。 このプロパティはOPTIONALである。
expandRelativeUrls
DIDリゾルバーに、 DID 文書内の 相対DID URLを、 DID URL構文に適合する 絶対DID URLへ展開するよう指示する真偽値フラグ。
versionId
定義については3. DIDパラメーターを参照。
versionTime
定義については3. DIDパラメーターを参照。

4.2 DID解決メタデータ

これは、DID 解決プロセスに関するメタデータを含む メタデータ構造である。

このメタデータは、解決プロセス自体に関するデータを表すため、 通常は DID解決 関数の呼び出しごとに変化する。

このメタデータのソースはDIDリゾルバーである。

DID解決メタデータの例には次が含まれる。

この構造内で可能なプロパティおよびそれらの可能な値は、DID Resolution Extensions [DID-EXTENSIONS-RESOLUTION]に登録されるべき SHOULDである。 本仕様は次の共通メタデータプロパティを定義する。

contentType
返されるdidDocumentのメディアタイプ。この プロパティはOPTIONALである。存在する場合、このプロパティの値は、 適合する表現の メディアタイプである ASCII文字列でなければ MUSTならない。この場合、resolve関数の呼び出し元は、 didDocumentの解析および処理方法を決定する際にこの値を使用しなければ MUSTならない。
error
エラーデータ構造は[RFC9457]で定義される。本仕様で 定義されるエラーは、11. エラーの節に示されている。 追加のエラーはDID Resolution Extensions [DID-EXTENSIONS-RESOLUTION]に登録されるべき SHOULDである。
proof

一部のDID リゾルバーおよびDID URL参照解決器は、 DID解決またはDID URL参照解決 関数を実行する際に証明を使用する。詳細については 8.2 リゾルバーアーキテクチャを参照。

DID 解決メタデータはproofプロパティを含んでもMAYよい。 存在する場合、その値は 集合でなければMUSTならず、 各項目は証明を表すマップである。このプロパティの使用 および証明の型は、DIDメソッドに依存しない。

4.3 DID文書メタデータ

これは、DID 解決プロセスに関するメタデータを含む メタデータ構造である。

このメタデータは、DID文書に 関するデータを表すため、 DID解決 関数の呼び出し間では、DID文書 が変更されない限り、通常は変化しない。

このメタデータのソースは、DIDコントローラーおよび/または DIDメソッドである。DID コントローラーによって証明されたDID文書メタデータには、正確性についての固有の保証はない。 クライアントは、ビジネスロジックを判断するためにDID文書メタデータに依存する場合、 慎重に進めることが推奨される。

DID文書メタデータの例には次が含まれる。

この構造内で可能なプロパティおよびそれらの可能な値は、DID Document Properties Extensions [DID-EXTENSIONS-PROPERTIES]に登録されるべき SHOULDである。本仕様は次の共通 メタデータプロパティを定義する。

created
DID文書 メタデータは、Create操作の タイムスタンプを示すために、createdプロパティを含むべき SHOULDである。そのプロパティの値は 3.1 日時で定義される 日時形式で表現されなければMUSTならない。
updated
DID文書 メタデータは、解決された文書バージョンに対する最後の Update操作のタイムスタンプを示すために、 updatedプロパティを含むべき SHOULDである。そのプロパティの値は 3.1 日時で定義される日時形式で表現されなければ MUSTならない。 DID文書に対して Update操作が一度も実行されていない場合、updatedプロパティは省略される。 updatedプロパティが存在する場合、2つのタイムスタンプの差が1秒未満であれば、 それはcreatedプロパティと同じ値であってもよい。
deactivated
DIDが無効化されている場合、 DID文書 メタデータは、このプロパティを真偽値trueで含まなければ MUSTならない。DIDが無効化されていない場合、 このプロパティはOPTIONALであるが、含まれる場合は 真偽値falseを持たなければMUSTならない。
nextUpdate
解決された文書バージョンが文書の最新バージョンでない場合、 DID文書 メタデータは nextUpdateプロパティを含んでもMAYよい。 これは次のUpdate操作の タイムスタンプを示す。そのプロパティの値は 3.1 日時で定義される 日時形式で表現されなければMUSTならない。
versionId
DID文書 メタデータは、解決された文書バージョンに対する最後の Update操作のバージョンを示すために、 versionIdプロパティを含むべきSHOULDである。 そのプロパティの値は ASCII文字列でなければ MUSTならない。
nextVersionId
解決された文書バージョンが文書の最新バージョンでない場合、 DID文書 メタデータは nextVersionIdプロパティを含んでもMAYよい。 これは次のUpdate操作の バージョンを示す。そのプロパティの値はASCII文字列でなければ MUSTならない。
equivalentId

DIDメソッドは、 論理的に等価であるDIDの 異なる形式を定義できる。例として、DID検証可能データ レジストリへの登録前にある形式を取り、 登録後に別の形式を取る場合がある。この場合、 DIDメソッド 仕様は、解決されたDIDと 論理的に等価な1つ以上のDIDを、 DID 文書のプロパティとして表現する必要がある場合がある。これが equivalentId プロパティの目的である。

DID 文書メタデータは equivalentIdプロパティを含んでもMAYよい。存在する場合、その値は、 各項目が 文字列であり、かつ Decentralized Identifiers (DIDs) v1.0の節の規則に適合する 集合でなければMUSTならない。 その関係は、各 equivalentId 値がidプロパティ値と論理的に 等価であり、したがって同じDID 主体を参照するという 記述である。各 equivalentId DID値は、idプロパティ値と同じ DIDメソッドによって 生成され、その形式でなければMUSTならない。 (例: did:example:abc == did:example:ABC

適合するDID メソッド仕様は、各 equivalentId 値がidプロパティ値と論理的に 等価であることを保証しなければMUSTならない。

要求側は、 idおよび equivalentId プロパティの値を保持し、それらに含まれるいずれかの値との後続のやり取りが 論理的に等価なものとして正しく処理されるようにすることが期待される (例: すべてのバリアントをデータベースに保持し、いずれか1つとのやり取りが 同じ基礎アカウントにマッピングされるようにする)。

注記: より強い等価性

equivalentIdalsoKnownAsよりも はるかに強い形式の等価性である。なぜなら、その等価性は統括するDID メソッドによって保証されなければ MUSTならないからである。 equivalentId の使用は、同じDID文書が、 equivalentId DIDidプロパティのDIDの 両方を記述することを意味する。

要求側がidおよび equivalentId プロパティの値を保持せず、 それらに含まれるいずれかの値との後続のやり取りが 論理的に等価なものとして正しく処理されるようにしない場合、 否定的または予期しない問題が発生する可能性がある。実装者は、 このメタデータプロパティに関連する指示を遵守することを 強く推奨される。

canonicalId

canonicalId プロパティは、 equivalentId プロパティと同一であるが、次の点を除く。a) 集合ではなく単一の値に関連付けられること、b) DIDが、 それを含むDID 文書の範囲内で、 DID 主体の正準IDとして定義されることである。

DID 文書メタデータはcanonicalId プロパティを含んでもMAYよい。 存在する場合、その値は 文字列であり、 Decentralized Identifiers (DIDs) v1.0の節の規則に 適合しなければMUSTならない。 その関係は、 canonicalId 値がidプロパティ値と論理的に等価であり、かつ canonicalId 値がDIDメソッドによって、 それを含むDID 文書の範囲内で DID主体の正準IDとして 定義されるという記述である。 canonicalId 値は、idプロパティ値と同じDIDメソッドによって 生成され、その形式でなければMUSTならない。 (例: did:example:abc == did:example:ABC)。

適合するDID メソッド仕様は、 canonicalId 値が idプロパティ値と論理的に等価であることを保証しなければ MUSTならない。

要求側は、 canonicalId 値を DID主体の主要な ID値として使用し、他のすべての等価な値を二次的な別名として扱うことが期待される (例: 新しい正準ID指示を反映するように、システム内の対応する主要参照を更新する)。

注記: 正準等価性

canonicalIdequivalentId と同じ等価性の記述であるが、 DID主体について、 DID 文書の範囲内で正準であると定義される 単一の値に制約される点が異なる。 equivalentIdと同様に、 canonicalId の使用は、同じDID文書が、 canonicalId DIDと idプロパティのDIDの 両方を記述することを意味する。

解決側が canonicalId 値をDID主体の主要な ID値として使用せず、他のすべての等価な値を 二次的な別名として扱わない場合、ユーザー体験に関連して 否定的または予期しない問題が発生する可能性がある。実装者は、 このメタデータプロパティに関連する指示を遵守することを強く 推奨される。

proof

多くのDID メソッドは、 メソッド操作を実行する際に証明を使用する。詳細については 8.1 メソッド アーキテクチャを参照。

DID 文書メタデータは proofプロパティを含んでもMAYよい。存在する場合、その値は 集合でなければMUSTならず、 各項目は証明を表す マップである。このプロパティの使用 および証明の型は DID メソッド固有である。

4.4 DID解決アルゴリズム

DIDリゾルバーは、 次の DID解決 アルゴリズムを実装する。

  1. 入力DIDDID構文did規則に適合することを検証する。 適合しない場合、DID リゾルバーは次の結果を返さなければ MUSTならない。
    1. didResolutionMetadata: 型が https://www.w3.org/ns/did#INVALID_DIDに設定された エラーオブジェクト
    2. didDocument: null
    3. didDocumentMetadata: «[ ]»
  2. 入力DIDの DIDメソッドが、 このアルゴリズムを実装する DIDリゾルバー によってサポートされているかどうかを判定する。 サポートされていない場合、DID リゾルバーは次の 結果を返さなければMUSTならない。
    1. didResolutionMetadata: 型が https://www.w3.org/ns/did#METHOD_NOT_SUPPORTEDに設定された エラーオブジェクト
    2. didDocument: null
    3. didDocumentMetadata: «[ ]»
  3. 入力DID解決オプション が、このアルゴリズムを実装する DIDリゾルバーによって サポートされているかどうかを判定する。サポートされていない場合、 DIDリゾルバーは 次の結果を返さなければMUSTならない。
    1. didResolutionMetadata: 型が https://www.w3.org/ns/did#FEATURE_NOT_SUPPORTEDに設定された エラーオブジェクト
    2. didDocument: null
    3. didDocumentMetadata: «[ ]»
  4. 入力DID解決オプション が有効かどうかを判定する。有効でない場合、 DIDリゾルバーは 次の結果を返さなければMUSTならない。
    1. didResolutionMetadata: 型が https://www.w3.org/ns/did#INVALID_OPTIONSに設定された エラーオブジェクト
    2. didDocument: null
    3. didDocumentMetadata: «[ ]»
  5. 入力DIDDID 文書を、 入力DIDメソッドによって 定義される Resolve 操作を実行することで取得する。
    1. 入力DID が存在しない場合、次の結果を返す。
      1. didResolutionMetadata: 型が https://www.w3.org/ns/did#NOT_FOUNDに設定された エラーオブジェクト
      2. didDocument: null
      3. didDocumentMetadata: «[ ]»
    2. 入力DID が無効化されている場合、次の結果を返す。
      1. didResolutionMetadata: «[ ... ]»
      2. didDocument: null
      3. didDocumentMetadata: «[ "deactivated" → true, ... ]»
    3. それ以外の場合、Resolve 操作の結果を出力DID文書と呼ぶ。 この結果は 適合表現で表現されなければ MUSTならない。
  6. 入力DID解決オプション が、値trueexpandRelativeUrlsオプションを含む場合:
    1. 出力DID文書内の すべてのサービス検証メソッド検証 関係 および拡張定義プロパティを反復処理する。
    2. 各項目について、その項目がオブジェクトであり、 idプロパティの値が相対DID URLである場合、 または検証 関係相対DID URLである場合:
      1. Decentralized Identifiers (DIDs) v1.0相対DID URLの節の規則に従い、 相対DID URLを、 DID URL構文に適合する 絶対DID URLへ解決する。
    3. 出力DID文書を更新し、 相対DID URLを、解決された 絶対DID URLに置き換える。
  7. 次の結果を返す。
    1. didResolutionMetadata: «[ ... ]»
    2. didDocument: 出力DID文書
    3. didDocumentMetadata: «[ "contentType" → 出力DID文書メディア タイプ, ... ]»

DIDリゾルバーが DID解決アルゴリズムの実行中に 予期しないエラーに遭遇した場合、次の結果を返さなければ MUSTならない。

  1. didResolutionMetadata: 型が https://www.w3.org/ns/did#INTERNAL_ERRORに設定された エラーオブジェクト
  2. didDocument: null
  3. didDocumentMetadata: «[ ]»

5. DID URL参照解決

(リスクのある機能)課題 2

このセクション全体は現在リスクありとされており、大幅に変更されるか、 仕様から削除される可能性があります。ワーキンググループは、このセクションの 価値について、 実装者からのフィードバックを求めています。

DID URL 参照解決関数は、DID URLを、DIDメソッド、 メソッド固有識別子、パス、 クエリ、およびフラグメントを含む DID URLの構成要素に応じた内容を持つ リソース へ参照解決する。このプロセスは、 DID URLに含まれる DIDDID解決に依存する。DID URL 参照解決には、 複数のステップが含まれることがある(たとえば、参照解決対象のDID URLがフラグメントを含む場合)。 そしてこの関数は、すべてのステップが完了した後の最終的なリソースを返すように定義される。 次の図は、上記の関係を示す。


DIDはDID文書へ解決される。DID URLはDIDを含む。DID URLはDID文書フラグメントまたは
外部リソースへ参照解決される。
1 DID URL参照解決の概要。関連情報: 叙述的説明

図の左上部分には、黒い輪郭を持つ、"DID"とラベル付けされた長方形がある。

図の左下部分には、黒い輪郭を持つ、"DID URL"とラベル付けされた長方形がある。 この長方形には、黒い輪郭を持つ4つの小さな長方形が含まれ、 互いに隣接して横一列に並んでいる。これらの小さな 長方形には、順に"DID"、"path"、"query"、および"fragment"とラベル付けされている。

図の右上部分には、黒い輪郭を持つ、"DID document"とラベル付けされた長方形がある。 この長方形には、黒い輪郭を持つ3つの小さな 長方形が含まれている。これらの小さな長方形には、"id"、"(property X)"、および "(property Y)"とラベル付けされ、複数の3点リーダー(省略記号)の列で囲まれている。 "DID document - relative fragment dereference"とラベル付けされた曲線の黒い矢印が、 "(property X)"とラベル付けされた長方形から伸び、 "(property Y)"とラベル付けされた長方形を指している。

図の右下部分には、黒い輪郭を持つ、"Resource"とラベル付けされた楕円形がある。

"resolves to a DID document"とラベル付けされた黒い矢印が、 図の左上部分にある"DID"とラベル付けされた長方形から伸び、 図の右上部分にある"DID document"とラベル付けされた長方形を指している。

"refers to"とラベル付けされた黒い矢印が、図の右上 部分にある"DID document"とラベル付けされた長方形から伸び、図の 右下部分にある"Resource"とラベル付けされた楕円形を指している。

"contains"とラベル付けされた黒い矢印が、 図の左下部分にある"DID URL"とラベル付けされた長方形の中の、"DID"とラベル付けされた小さな長方形から伸び、 図の左上部分にある"DID"とラベル付けされた長方形を指している。

"dereferences to a DID document"とラベル付けされた黒い矢印が、 図の左下部分にある"DID URL"とラベル付けされた長方形から伸び、 図の右上部分にある"DID document"とラベル付けされた長方形を指している。

"dereferences to a resource"とラベル付けされた黒い矢印が、 図の左下部分にある"DID URL"とラベル付けされた長方形から伸び、 図の右下部分にある"Resource"とラベル付けされた楕円形を指している。

すべての適合DID URL参照解決器は、以下の 関数を実装する。この関数は 次の抽象形式を持つ。

dereference(didUrl, dereferenceOptions) →
   « dereferencingMetadata, contentStream, contentMetadata »

すべての適合DID URL参照解決器は、少なくとも1つの DIDメソッドについて DID URL参照解決関数を 実装しなければMUSTならない。 contentStreamを除くdereference 関数のすべての入力および 出力は、JSONへシリアライズ可能でなければMUSTならない。

dereference関数の入力変数は 次のとおりである。

didUrl
単一の文字列としての、適合する DID URL。 これは参照解決対象のDID URLである。 DIDフラグメントを参照解決するには、 DID フラグメントを含む完全な DID URLを使用しなければ MUSTならない。 この入力はREQUIREDである。
注記: DID URL 参照解決器のパターン

任意のdidUrlをDID URL参照解決器に渡すことは有効であるが、実装者は、 DID URLがどのように参照解決されることが期待されるかについての 一般的なパターンをさらに理解するために、 5. DID URL参照解決 を参照することが期待される。

dereferencingOptions
didUrl自体に加えて、 dereference関数への入力オプションから構成される メタデータ構造である。この構造は 5.1 DID URL 参照解決オプションでさらに定義される。この入力はREQUIREDであるが、 構造は空であってもMAYよい。

この関数は複数の値を返し、これらの値をまとめて返す方法には 制限を設けない。dereferenceの戻り値は、 dereferencingMetadatacontentStream、およびcontentMetadataである。 これらの値については以下で説明する。

dereferencingMetadata
DID URL参照解決プロセスの 結果に関連する値から構成される メタデータ構造である。 この構造はREQUIREDであり、参照解決プロセスでエラーが発生した場合、 これは空であってはMUST NOTならない。この構造は 5.2 DID URL 参照解決メタデータでさらに定義される。参照解決が成功しなかった場合、 この構造はエラーを記述するerrorプロパティを含まなければ MUSTならない。11. エラーの節を参照。
contentStream
dereferencing関数が呼び出され成功した場合、 これはDID URLに対応する リソースを含まなければ MUSTならない。 contentStreamは、適合する 表現のいずれかでシリアライズ可能な DID 文書検証メソッドサービス、または メディアタイプを介して識別され解決プロセスを通じて取得できる その他の任意のリソース形式などの リソースであっても MAYよい。参照解決が成功しなかった場合、 この値は空でなければMUSTならない。
contentMetadata
参照解決が成功した場合、これは メタデータ構造でなければMUSTならないが、 その構造は空であってもMAYよい。この 構造はcontentStreamに関するメタデータを含む。 contentStreamDID文書である場合、 これはDID解決で説明される didDocumentMetadata構造でなければ MUSTならない。参照解決が成功しなかった場合、 この出力は空のメタデータ 構造でなければMUSTならない。この 構造は5.3 DID URLコンテンツメタデータでさらに定義される。

適合するDID URL 参照解決実装は、 これらの関数のシグネチャをいかなる方法でも変更しない。 DID URL 参照解決実装は、実際の DID URL参照解決プロセスを 実行するために、dereference関数をメソッド固有の内部関数に マッピングすることがある。 DID URL 参照解決実装は、ここで指定される dereference関数に加えて、異なるシグネチャを持つ追加の関数を実装し、 公開することがある。

5.1 DID URL参照解決オプション

これは、 DID URL 参照解決プロセスの入力オプションを含む メタデータ構造である。

この構造内で可能なプロパティおよびそれらの可能な値は、DID Resolution Extensions [DID-EXTENSIONS-RESOLUTION]に登録されるべき SHOULDである。 本仕様は次の共通入力オプションを定義する。

accept
呼び出し元がcontentStreamについて選好する メディアタイプ。その値は、 HTTP Semantics第12.5.1節で定義される Acceptヘッダー値に従って表現されなければ MUSTならない。DID URL 参照解決器 実装は、そのような表現が対応され利用可能である場合、 返される値に含まれる 表現contentTypeを決定するために、この値を使用すべき SHOULDである。
verificationRelationship
呼び出し元が、DID URLから参照解決されたverificationMethodについて 認可されていることを期待するverificationRelationship。存在する場合、関連値は ASCII文字列でなければ MUSTならない。DID URLが verificationMethodへ参照解決されない場合、またはDID文書が指定された verificationRelationshipについてverificationMethodを認可しない場合、エラーを 発生させなければMUSTならない。

5.2 DID URL参照解決メタデータ

これは、DID URL参照解決プロセスに 関するメタデータを含む メタデータ構造である。

このメタデータは、参照解決プロセス自体に関するデータを表すため、 通常は DID URL 参照解決関数の呼び出しごとに変化する。

このメタデータのソースはDID URL参照解決器である。

この構造内で可能なプロパティおよびそれらの可能な値は、DID Resolution Extensions [DID-EXTENSIONS-RESOLUTION]に登録されるべき SHOULDである。 本仕様は次の共通メタデータプロパティを定義する。

contentType
参照解決が成功した場合、返されるcontentStreamのメディアタイプは、 このプロパティを使用して表現されるべきSHOULDである。 メディアタイプ値は ASCII文字列として表現されなければ MUSTならない。
error
[RFC9457]で定義されるエラーデータ構造。 このプロパティは、参照解決プロセスでエラーが発生した場合に REQUIREDである。本仕様で定義されるエラーは 11. エラーの節に示されている。 追加のエラーはDID Resolution Extensions [DID-EXTENSIONS-RESOLUTION]に登録されるべき SHOULDである。
proof

一部のDID リゾルバーおよび DID URL 参照解決器は、 DID 解決またはDID URL参照解決 関数を実行する際に証明を使用する。詳細については 8.2 リゾルバーアーキテクチャを参照。

DID URL 参照解決メタデータは proofプロパティを含んでもMAYよい。 存在する場合、その値は 集合でなければMUSTならず、 各項目は証明を表す マップである。このプロパティの使用 および証明の型は DID メソッドに依存しない。

5.3 DID URLコンテンツメタデータ

これは、DID URL参照解決プロセスに 関するメタデータを含む メタデータ構造である。

このメタデータは、コンテンツに関するデータを表すため、 コンテンツが変更されない限り、通常は DID URL 参照解決関数の呼び出し間では変化しない。

このメタデータのソースは、DIDコントローラーおよび/または DIDメソッドである。

この構造内で可能なプロパティおよびそれらの可能な値は、DID Resolution Extensions [DID-EXTENSIONS-RESOLUTION]に登録されるべき SHOULDである。 本仕様は共通プロパティを定義しない。

5.4 DID URL参照解決 アルゴリズム

DID URL 参照解決器は、次の DID URL 参照解決アルゴリズムを実装する。 [RFC3986]に従い、 これは次の3つのステップで構成される。DIDの解決、 リソースの参照解決、およびフラグメントの参照解決( 入力DID URLDIDフラグメントを含む場合のみ)。

5.4.1 リソースの参照解決

  1. 入力DID URLDID URL構文did-url規則に適合することを検証する。 適合しない場合、DID URL参照解決器は 次の結果を返さなければMUSTならない。
    1. dereferencingMetadata: 型が https://www.w3.org/ns/did#INVALID_DID_URLに設定された エラーオブジェクト
    2. contentStream: null
    3. contentMetadata: «[ ]»
  2. 4. DID解決で定義される DID 解決アルゴリズムを実行することで、 入力DIDDID 文書を取得する。 すべての参照解決オプションおよび 入力DID URLのすべての DIDパラメーターは、 DID解決アルゴリズムへ 解決オプションとして渡されなければ MUSTならない。
  3. 入力DIDが VDRに存在しない場合、 DID URL参照解決器は 次の結果を返さなければ MUSTならない。
    1. dereferencingMetadata: 型が https://www.w3.org/ns/did#NOT_FOUNDに設定された エラーオブジェクト
    2. contentStream: null
    3. contentMetadata: «[ ]»
  4. それ以外の場合、 DID 解決アルゴリズムのdidDocument結果を、 解決済みDID文書と呼ぶ。
  5. 存在する場合、 DIDフラグメント入力DID URLから分離し、 調整後の入力DID URLで続行する。
  6. 入力DID URLDIDパスDIDクエリも 含まない場合:
    did:example:1234
    DID URL参照解決器は、 解決済みDID文書および 解決済み4.3 DID 文書メタデータを次のように返さなければ MUSTならない。
    1. dereferencingMetadata: «[ ... ]»
    2. contentStream: resolved DID document
    3. contentMetadata: «[ resolved DID document metadata
  7. 入力DID URLDIDパラメーターserviceおよび/または DIDパラメーターserviceTypeを含み、 任意でDIDパラメーター relativeRefを含む場合:
    did:example:1234?service=files&relativeRef=%2Fmyresume%2Fdoc%3Fversion%3Dlatest
    1. 解決済みDID文書から、 次の条件を満たすすべてのサービスを 選択する。
      1. 入力DID URLDIDパラメーターserviceを含む場合: そのidプロパティが serviceDIDパラメーターの値と一致する場合、その サービスを選択する。 idプロパティまたはserviceDID パラメーター、あるいはその両方が相対参照を含む場合、 RFC3986第5節: 参照解決およびDecentralized Identifiers (DIDs) v1.0相対DID URLの節で指定される規則を使用して、 対応する絶対URIを解決し、一致の判定に使用しなければ MUSTならない。
      2. 入力DID URLDIDパラメーター serviceTypeを含む場合: そのtypeプロパティが serviceTypeDIDパラメーターの値と一致する場合、その サービスを選択する。
      選択されたサービスは、 選択済みサービスと呼ばれるリストである。
    2. 入力DID URLDIDパラメーターrelativeRefを 含む場合:
      1. 選択済みサービスについて:
        1. 選択済みサービスserviceEndpointプロパティの値が マップである場合、この 選択済みサービスをスキップする。
        2. 選択済みサービスserviceEndpointプロパティの値が 文字列である場合、この値を 選択済みDID サービスエンドポイントURLのリストに追加する。
        3. 選択済みサービスserviceEndpointプロパティの値が 集合である場合、 その中の文字列であるすべての項目を 選択済みDID サービスエンドポイントURLのリストに追加する。
      2. 選択済みDID サービスエンドポイントURLについて、 RFC3986第5節: 参照解決で指定されるアルゴリズムを次のように実行する。
        1. base URI値は、 選択済みDID サービスエンドポイントURLである。
        2. relative referenceは、 DIDパラメーター relativeRefの値である。
        3. 選択済みDID サービスエンドポイントURLを、 "Reference Resolution"アルゴリズムの結果に更新する。
        注記

        DID サービスエンドポイント— 特にそれがDIDである場合—を参照解決すると、 参照解決 サイクルが発生する可能性がある。これは 無限ループを生じる一連の ステップである。たとえば、 DID サービスエンドポイントが、一連の参照解決プロセスを通じて 以前に参照解決された識別子へ間接的に戻るように指すことがある。 DID URL参照解決器DID サービスエンドポイントを再帰的に参照解決する場合、 無限ループまたは参照解決失敗を防ぐために、そのようなサイクルを 検出し処理することが推奨される。詳細な指針については、 参照解決の循環の節を参照。

    3. accept 入力DID URL参照解決 オプション が欠落している場合、またはその値が DID 文書表現のメディアタイプである場合:
      1. 解決済みDID 文書内のサービスを、 選択済みサービスのみを 含むように更新する。
      2. 次の結果を返す。
        1. dereferencingMetadata: «[ ... ]»
        2. content: resolved DID document with selected services
        3. contentMetadata: «[ resolved DID document metadata
    4. accept 入力DID URL参照解決オプション の値が text/uri-listである場合:
      1. 次の結果を返す。
        1. dereferencingMetadata: «[ ... ]»
        2. content: « selected service endpoint URLs »
        3. contentMetadata: «[ "contentType" → "text/uri-list", ... ]»
    5. それ以外の場合、次の結果を返す。
      1. dereferencingMetadata: 型が https://www.w3.org/ns/did#REPRESENTATION_NOT_SUPPORTEDに設定された エラーオブジェクト
      2. content: null
      3. contentMetadata: «[ ]»
  8. それ以外で、 入力DID URLDIDパスおよび/または DIDクエリを含む場合:
    did:example:1234/custom/path?customquery
    1. 適用されるDIDメソッドは、 入力DID URLDIDパスおよび/またはDID クエリを どのように参照解決するかを指定してもMAYよい。
      did:example:1234/resources/1234
    2. 拡張仕様は、 入力DID URLDID パスを どのように参照解決するかを指定してもMAYよい。
      did:example:1234/whois
    3. 拡張仕様は、 入力DID URLDID クエリを どのように参照解決するかを指定してもMAYよい。
      did:example:1234?transformKey=JsonWebKey
    4. クライアントは、 入力DID URLを アプリケーション固有の方法で参照解決できてもMAYよい。
  9. このアルゴリズム、適用される DIDメソッド、 拡張、またはクライアントのいずれも 入力DID URLを参照解決できない場合、次の 結果を返す。
    1. dereferencingMetadata: 型が https://www.w3.org/ns/did#NOT_FOUNDに設定された エラーオブジェクト
    2. contentStream: null
    3. contentMetadata: «[ ]»

5.4.2 フラグメントの参照解決

入力DID URLDIDフラグメントを含む場合、 そのフラグメントの参照解決は、リソースのメディアタイプ ([RFC2046])、 すなわち 5.4.1 リソースの参照解決の結果に依存する。

  1. 5.4.1 リソースの参照解決の結果が 出力DID 文書であり、 入力DID URL参照解決オプションverificationRelationshipオプションを含む場合:
    1. verificationRelationshipverificationRelationship オプションの値とする。
    2. verificationMethodを、 出力DID文書から そのDID文書のメディアタイプの規則に従って DIDフラグメントを 参照解決した結果とする。
    3. verificationMethod適合 検証メソッドでない場合、 エラーを発生させなければMUSTならず、 INVALID_VERIFICATION_METHODの エラー型を伝えるべきSHOULDである。
    4. verificationMethodが、 verificationRelationshipによって識別される 出力DID文書内の 検証 関係配列に、参照(URL)または値(オブジェクト)によって 関連付けられていない場合、エラーを発生させなければ MUSTならず、 INVALID_RELATIONSHIP_FOR_VERIFICATION_METHODの エラー型を伝えるべきSHOULDである。
    5. verificationMethodを返す。
  2. 5.4.1 リソースの参照解決の結果が 選択済みDIDサービス エンドポイントURLであり、 入力DID URLDIDフラグメントを含む場合:
    did:example:1234?service=files&relativeRef=%2Fmyresume%2Fdoc%3Fversion%3Dlatest#intro
    1. 選択済みDIDサービス エンドポイントURLfragment構成要素を含む場合、エラーを発生させる。
    2. DIDフラグメントを、 選択済みDIDサービス エンドポイントURLに追加する。言い換えれば、 選択済みDIDサービス エンドポイントURLは、 入力DID URLDID フラグメントを「継承」する。
    3. 選択済みDIDサービス エンドポイントURLを返す。
  3. それ以外の場合、リソースのメディアタイプ ([RFC2046]) によって定義されるとおりにDIDフラグメントを参照解決する。たとえば、 リソースがメディアタイプapplication/didを持つDID文書の表現である場合、 そのフラグメントは JSON-LD 1.1: application/ld+json media type [JSON-LD11]に関連付けられた規則に従って扱われる。
注記

このDIDフラグメントの使用は、 [RFC3986]における フラグメント識別子の定義と整合している。それは 一次リソースDID文書)の部分集合である 二次リソースを識別する。

注記

このDIDフラグメントの挙動は、 HTTP URL内のフラグメントを処理する場合、すなわちその参照解決が Locationヘッダーを持つHTTP 3xx(リダイレクト) 応答を返す場合と類似している( [RFC7231]の 第7.1.2節を参照)。

5.5

5.5.1 例: 検証メソッドへの参照解決

次の 入力DID URLが与えられたとする。

did:example:123456789abcdefghi#keys-1

... そして、次の解決済みDID文書が与えられたとする。

{
	"@context":[
		"https://www.w3.org/ns/did/v1.1",
		"https://didcomm.org/messaging/contexts/v2",
		"https://identity.foundation/linked-vp/contexts/v1"
	],
	"id": "did:example:123456789abcdefghi",
	"verificationMethod": [{
		"id": "did:example:123456789abcdefghi#keys-1",
		"type": "Multikey",
		"controller": "did:example:123456789abcdefghi",
		"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
	}],
	"service": [{
		"id": "did:example:123456789abcdefghi#messages",
		"type": "DIDCommMessaging",
		"serviceEndpoint": "https://example.com/messages/8377464"
	}, {
		"id": "did:example:123456789abcdefghi#linkedvp",
		"type": "LinkedVerifiablePresentation",
		"serviceEndpoint": "https://example.com/verifiable-presentation.jsonld"
	}]
}

... その場合、5. DID URL参照解決アルゴリズムの結果は、 次の出力リソースである。

{
	"@context": "https://www.w3.org/ns/did/v1.1",
	"id": "did:example:123456789abcdefghi#keys-1",
	"type": "Multikey",
	"controller": "did:example:123456789abcdefghi",
	"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}
DID URLを検証メソッドへ参照解決できることを示す図
2 DID URLを検証メソッドへ参照解決する。

5.5.2 例: サービスエンドポイントURLへの参照解決

次の 入力DID URLが与えられたとする。

did:example:123456789abcdefghi?service=messages&relativeRef=%2Fsome%2Fpath%3Fquery#frag

... そして、前の節と同じ 解決済みDID 文書が与えられたとする。

... その場合、5. DID URL参照解決アルゴリズムの結果は、 次の選択済みDIDサービスエンドポイント URLである。

https://example.com/messages/8377464/some/path?query#frag
DID URLをサービスエンドポイントURLへ参照解決できることを示す図
3 DID URLをサービスエンドポイントURLへ参照解決する。

6. 暫定 - DID URL 参照解決

(リスクのある機能)課題 3

このセクションの逆参照アルゴリズムは、前のセクションのものに対する代替アプローチであり、 現在リスクありとされています。 ワーキンググループは、この仕様の逆参照アルゴリズムについて、 ここで議論されている改訂案に 収束する可能性があります。

注記

作業グループは現在、"取得戦略"または"処理戦略"に基づく、 従来のものよりもモジュール化されたアプローチを持つ、 この新しいDID URL参照解決アルゴリズムを検討している。

6.1 DID URL参照解決 アルゴリズム

6.1.1 解決の準備

DID URLを参照解決する最初のステップは、 DIDを解決のために準備することである。これには、DID URL構文の検証、適切な DID リゾルバーの選択、ならびにDIDおよび付随する DID解決オプションを解決要求のために準備することが含まれる。

注記

作業グループは現在、 DID解決関数の入力を DIDからDID URLへ 変更するかどうかを議論している。

6.1.2 解決要求の実行

次のステップは、DIDリゾルバーを選択し、 準備済みの入力を使用して解決要求を実行することである。これは、 特定のDIDリゾルバーの実装に応じて、 外部サービスへのネットワーク要求を伴う場合もあれば、ローカル解決プロセスを 伴う場合もある。その結果はDID解決結果であり、 解決済みDID文書および関連メタデータ、またはエラー情報を含む。

6.1.3 取得 戦略の決定

DID文書および付随するメタデータを正常に解決した後、次のステップは、 DID URLによって識別される リソースを取得するための適切な戦略を決定することである。これには、 DID文書およびそのメタデータを含む DID解決結果の内容を、 DID URLのパスおよびクエリ構成要素とともに分析し、 リソースを取得する方法を決定することが含まれる。

6.1.4 リソースの取得

次のステップは、決定された取得戦略を使用して、DID URLによって識別される リソースを取得することである。取得戦略は外部仕様で定義されることがある。 指定された戦略を使用してリソースを取得できるかどうかを判断するのは クライアント次第である。

6.1.5 リソースの使用

最後のステップは、取得されたリソースを使用して、参照解決が呼び出された コンテキストにおけるDID URL参照解決プロセスを完了することである。 これには、取得されたリソースにフラグメント識別子を適用すること、 結果として得られたリソースを呼び出し元のアプリケーションプロセスで利用可能にすること、 または参照解決を完了できない場合にエラーを生成することが含まれることがある。

7. メタデータ構造

入力および出力メタデータは、多くの場合、 DID解決DID URL 参照解決、およびその他の DID関連プロセスの間に関与する。このメタデータを伝達するために使用される構造は、 プロパティのマップでなければ MUSTならない。各プロパティ名は 文字列でなければ MUSTならない。各プロパティ値、およびマップやリストなどの 複雑なデータ構造内の各値は、文字列数値マップリスト集合真偽値、または nullでなければ MUSTならない。メタデータ構造全体は、[INFRA]仕様における JSONシリアライズ 規則に従ってシリアライズ可能でなければ MUSTならない。実装は、メタデータ 構造を他のデータ形式にシリアライズしてもMAYよい。

注記

メタデータ構造を入力または出力として使用する関数のすべての実装は、 ここで説明されるすべてのデータ型を決定論的な方法で完全に表現できる。 メタデータ構造を使用する入力および出力は、シリアライズではなくデータ型の観点から 定義されるため、表現の方法は関数の実装内部のものであり、 本仕様の範囲外である。

次の例は、DID解決オプションとして使用される可能性のある JSONエンコードされたメタデータ構造を示す。

15: JSONエンコードされたDID解決オプションの例
{
"accept": "application/did"
}

この例は、次の形式のメタデータ構造に対応する。

16: DID解決オプションの例
«[
"accept""application/did"

次の例は、DID解決メタデータとして使用される可能性のある JSONエンコードされたメタデータ構造を示す。 これはDIDが 見つからなかった場合の例である。

17: JSONエンコードされたDID解決メタデータの例
{
"error": "notFound"
}

この例は、次の形式のメタデータ構造に対応する。

18: DID解決メタデータの例
«[
"error""notFound"

次の例は、DID文書メタデータとして使用される可能性のある JSONエンコードされたメタデータ構造を示す。これは DID文書に関連付けられた タイムスタンプを記述するためのものである。

19: JSONエンコードされたDID文書メタデータの例
{
"created": "2019-03-23T06:35:22Z",
"updated": "2023-08-10T13:40:06Z"
}

この例は、次の形式のメタデータ構造に対応する。

20: DID文書メタデータの例
«[
"created""2019-03-23T06:35:22Z",
"updated""2023-08-10T13:40:06Z"

8. DID解決アーキテクチャ

(リスクのある機能)課題 4

このセクションは現在リスクありとされており、 DID 解決脅威モデルの 内容に置き換えられる可能性があります。

8.1 メソッドアーキテクチャ

DID解決 アルゴリズムは、 Resolve操作を、 DIDに対して、 そのDID メソッドに従って実行することを含む( 4. DID解決を参照)。

すべてのDIDメソッドは、このメソッド操作、すなわち DIDリゾルバーが DIDからDID文書をどのように取得できるかを定義する。 基礎となるデータ形式、プロトコル、技術インフラストラクチャ、およびプロセスは、 DIDメソッド間で かなり異なる場合がある。

DIDメソッドに関する考慮事項の例には次が含まれる。

上記の考慮事項と DIDメソッドの "Resolve"操作の性質を組み合わせると、 DIDリゾルバー検証可能データレジストリ との相互作用は、 検証可能解決または 検証不能解決のいずれかと見なされ得る。

DIDメソッドの「検証可能解決」実装を示す図。
4 検証可能解決による DIDメソッドの実装。
DIDメソッドの「検証不能解決」実装を示す図。
5 検証不能解決による DIDメソッドの実装。

検証可能解決は、適用される DID メソッドの下で可能な範囲において、 "Resolve"操作の結果の完全性および正確性に対する信頼を最大化する。 これは、次のようないくつかの方法で達成できる。

検証不能解決にはそのような保証がなく、 したがって、たとえば次のように望ましさは低い。

注記: 実装の詳細

検証可能解決が可能かどうかは、 DIDメソッド 自体だけでなく、 DIDリゾルバーが そのDID メソッドをどのように実装するかにも依存する。 DIDメソッドは、 "Resolve"操作を実装する複数の方法を許可しても MAYよく、少なくとも1つの 検証可能解決を実装する方法について 指針を提供すべきSHOULDである。

注記: 検証可能データレジストリの 制限

検証可能解決に関連付けられる保証は、 常に、 DID メソッドの基礎となる 検証可能データ レジストリのアーキテクチャ、プロトコル、暗号学的要素、およびその他の側面によって 制限される。最も強いと考えられる検証可能解決 実装の形態は、リモートネットワークとのやり取りを一切必要としないもの (たとえば[DID-KEY]を参照)、 および特定のネットワークインフラストラクチャへの依存を最小化し、 "信頼の根"を証明済みのエントロピーと暗号技術に縮小するもの (たとえば[KERI]を参照)である。

検証可能解決を可能にするために、多くのDIDメソッドは デジタル署名、状態証明、Merkle木への包含証明、暗号学的イベントログ、またはその他の 種類の証明を使用する。DIDメソッドが そのような証明を使用する場合、そのDIDメソッド仕様において、それらが "Resolve"操作の結果の正確性を検証するためにどのように使用されるかを指定しなければ MUSTならない。

DIDメソッドは、 そのような証明を DID文書 自体に含めても、または DID文書メタデータproofプロパティに含めても MAYよい。 これにより、クライアントは、 DID解決 プロセスの結果を、DIDリゾルバーを信頼していない場合でも、 独立して検証できる可能性がある。

DIDメソッド由来の証明は DIDメソッド固有であり、 適用されるDIDメソッドの技術の範囲内で 理解されなければならないことに注意すること。 DID文書 またはDID文書メタデータ上の単純な署名は、 必ずしもDIDの制御を証明するものでも、 DID文書が そのDIDに 対して正しいものであることを保証するものでもない。 これらの証明は、 DID解決プロセスの結果の完全性および 真正性を、DIDメソッド 自体に関する限りで検証する助けとなる。しかし、 クライアントDIDリゾルバーとの間の バインディングが 安全であることは保証しない。8.2 リゾルバー アーキテクチャも参照。

8.2 リゾルバーアーキテクチャ

DID 解決および DID URL 参照解決のアルゴリズムは、抽象関数として定義される( 4. DID解決および5. DID URL参照解決を参照)。

これらのアルゴリズムは、DIDリゾルバーおよび DID URL 参照解決器によって実装され、 クライアントから バインディングを介して呼び出される。 バインディングは、抽象関数に具体的なプログラミングインターフェイスまたは 通信インターフェイスを使用してアクセスする方法を定義する。

バインディングの例には次が含まれる。

上記の考慮事項とバインディングの性質を組み合わせると、 クライアントDIDリゾルバーまたはDID URL 参照解決器との相互作用は、 ローカルバインディングまたは リモートバインディングのいずれかと見なされ得る。

「ローカルバインディング」を持つDIDリゾルバーを示す図。
6 DIDリゾルバーのための ローカルバインディング
「リモートバインディング」を持つDIDリゾルバーを示す図。
7 DIDリゾルバーのための リモートバインディング

可能な場合は常に、ローカルバインディングが望ましい。これは、 第三者および仲介者への依存を最小化し、セキュリティリスクを低減し、 DID 解決およびDID URL参照解決 関数の結果の完全性および正確性への信頼を最大化するためである。

場合によっては、 ローカルバインディングを使用できないことがある。 たとえば、制約のあるIoT(Internet of Things)環境、または DIDメソッドが複雑な インフラストラクチャを必要とする場合、または多くの異なる DIDメソッドに 対応する必要がある場合である。

クライアントリモートバインディングを使用する場合、 次の考慮事項が適用される。

DIDリゾルバーは、 DID解決メタデータproofプロパティに証明を含めてもMAYよい。

DIDリゾルバー由来の証明は、 DID メソッドに依存せず、すべてのDIDメソッドにわたって DIDリゾルバーにより 普遍的に適用できることに注意すること。これらの証明は、 DID解決 プロセスの結果の完全性および真正性を、 DIDリゾルバー自体に 関する限りで検証する助けとなる。しかし、適用される DIDメソッドの "Resolve"操作から得られる結果自体が正しいことは保証しない。 8.1 メソッドアーキテクチャも参照。

8.2.1 複数のメソッド

DIDリゾルバーは、 複数の DIDメソッドについて DID解決 アルゴリズムに対応することがある。

複数のDIDメソッドに対応するDIDリゾルバーを示す図。
8 複数のDIDメソッドに対応する DID リゾルバー

この場合、 8.1 メソッドアーキテクチャにおける 検証可能解決および検証不能解決 実装に関する上記の考慮事項は、対応する各 DIDメソッドに 個別に適用される。

8.2.2 プロキシされた解決

DIDリゾルバーは、 4. DID 解決で定義される DID解決 アルゴリズムを実行するプロキシとして機能する、別の DIDリゾルバーを 呼び出してもMAYよい。

その場合、最初のDID リゾルバークライアントとして 振る舞い、2番目の DIDリゾルバーを 呼び出すために適切な バインディングを選択する。 たとえば、DID リゾルバーローカルバインディング(コマンドライン ツールなど)を介して呼び出され、そのDIDリゾルバーがさらに リモートバインディングHTTP(S)バインディングなど)を介して別の DIDリゾルバーを 呼び出すことがある。

プロキシされた解決を使用する場合、"下流"リゾルバーは、 "上流"リゾルバーからのすべての DID解決メタデータおよび DID文書メタデータを、存在する可能性のある証明を含め、 透明な方法で保持すべきSHOULDである。このプロセスにおいて、 "下流"リゾルバーは、プロキシされた解決プロセス自体に関する任意のメタデータを含む、 独自のDID解決メタデータを追加しても MAYよい。

2つのDIDリゾルバーを示す図。一方は「ローカルバインディング」を介して呼び出され、もう一方は「リモートバインディング」を介して呼び出される。
9 クライアントローカルバインディングを介して DIDリゾルバーを呼び出し、 そのDIDリゾルバーが リモートバインディングを介して別の DID リゾルバーを呼び出し、それがさらに DIDメソッドの解決操作を 実行する。
注記: DNSとの比較

これは、DNSアーキテクチャにおいて"スタブリゾルバー"が"再帰リゾルバー"を 呼び出すことに類似している。ただし、概念は完全に比較可能ではない (DNS Resolutionは単一の具体的なプロトコルを使用するのに対し、 DID解決は異なるDIDメソッドおよび異なる バインディングによって実現される抽象関数である)。

8.2.3 クライアント側参照解決

DID URL参照解決アルゴリズムの異なる部分は、 リゾルバーアーキテクチャの異なるコンポーネントによって 実行されることがある。

具体的には、DID URLDIDフラグメントを 含んで参照解決される場合、 リソースの参照解決DID リゾルバーによって行われ、 フラグメントの参照解決クライアントによって行われる。

8.3

DID URL did:xyz:1234#keys-1が与えられた場合、 リソースの参照解決 (すなわちDID 文書)のために、 DIDリゾルバーローカルバインディングを介して呼び出され、 クライアントフラグメントの参照解決 (すなわちDID文書の一部)によって DID URL 参照解決アルゴリズムを完了できる。

DIDリゾルバーとクライアントによるDID URLのクライアント側参照解決を示す図
10 DID URLDID リゾルバーおよびクライアントによるクライアント側参照解決。

DID URL did:xyz:1234?service=agent&relativeRef=%2Fsome%2Fpath%3Fquery#fragが与えられた場合、 リソースの参照解決 (すなわちDID サービスエンドポイントURL)のために、 DIDリゾルバーが 呼び出され、 クライアントフラグメントの参照解決 (すなわちフラグメントを持つDID サービスエンドポイントURL)によって DID URL 参照解決アルゴリズムを完了できる。

DIDリゾルバーとクライアントによるDID URLのクライアント側参照解決を示す図
11 DID URLDID リゾルバーおよびクライアントによるクライアント側参照解決。

DID URL did:xyz:1234#keys-1が与えられた場合、 DIDリゾルバーローカルバインディングを介して呼び出され、 それがさらにリモートバインディングを介して別の DID リゾルバーを呼び出して リソースの参照解決 (すなわちDID 文書)を行い、 クライアントフラグメントの参照解決 (すなわちDID文書の一部)によって DID URL 参照解決アルゴリズムを完了できる。

2つのDIDリゾルバーとクライアントによるDID URLのクライアント側参照解決を示す図
12 2つのDID リゾルバーおよび クライアントによる DID URLの クライアント側参照解決(プロキシされた 解決との組み合わせ)。

9. DID解決結果

この節では、4. DID解決で説明される アルゴリズムの結果を表すJSONデータ構造を定義する。 DID解決結果は、 DID文書に加えて、 DID解決メタデータおよび DID文書メタデータを含む。

このデータ構造のメディアタイプは application/did-resolutionと定義される。

9.1

21: DID解決結果の例
{
	"didDocument": {
		"@context": "https://www.w3.org/ns/did/v1",
		"id": "did:example:123456789abcdefghi",
		"authentication": [{
			"id": "did:example:123456789abcdefghi#keys-1",
			"type": "Ed25519VerificationKey2018",
			"controller": "did:example:123456789abcdefghi",
			"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
		}],
		"service": [{
			"id":"did:example:123456789abcdefghi#vcs",
			"type": "VerifiableCredentialService",
			"serviceEndpoint": "https://example.com/vc/"
		}]
	},
	"didResolutionMetadata": {
		"contentType": "application/did",
		"retrieved": "2024-06-01T19:73:24Z",
	},
	"didDocumentMetadata": {
		"created": "2019-03-23T06:35:22Z",
		"updated": "2023-08-10T13:40:06Z",
		"method": {
			"nymResponse": {
				"result": {
					"data": "{\"dest\":\"WRfXPg8dantKVubE3HX8pw\",\"identifier\":\"V4SGRU86Z58d6TV7PBUe6f\",\"role\":\"0\",\"seqNo\":11,\"txnTime\":1524055264,\"verkey\":\"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV\"}",
					"type": "105",
					"txnTime": 1.524055264E9,
					"seqNo": 11.0,
					"reqId": 1.52725687080231475E18,
					"identifier": "HixkhyA4dXGz9yxmLQC4PU",
					"dest": "WRfXPg8dantKVubE3HX8pw"
				},
				"op": "REPLY"
			},
			"attrResponse": {
				"result": {
					"identifier": "HixkhyA4dXGz9yxmLQC4PU",
					"seqNo": 12.0,
					"raw": "endpoint",
					"dest": "WRfXPg8dantKVubE3HX8pw",
					"data": "{\"endpoint\":{\"xdi\":\"http://127.0.0.1:8080/xdi\"}}",
					"txnTime": 1.524055265E9,
					"type": "104",
					"reqId": 1.52725687092557056E18
				},
				"op": "REPLY"
			}
		}
	}
}

10. DID URL参照解決結果

(リスクのある機能)課題 5

このセクションは現在リスクありとされており、勧告候補フェーズ中に 大幅に変更されるか、削除される可能性があります。

この節では、5. DID URL 参照解決で説明される アルゴリズムの結果を表すJSONデータ構造を定義する。 DID URL参照解決結果は、コンテンツに加えて DID URL参照解決メタデータ およびDID URLコンテンツメタデータを含む。

このデータ構造のメディアタイプは application/did-url-dereferencingと定義される。

10.1

22: DID URL参照解決結果の例
{
	"content": {
		"@context": "https://www.w3.org/ns/did/v1",
		"id": "did:example:123456789abcdefghi",
		"authentication": [{
			"id": "did:example:123456789abcdefghi#keys-1",
			"type": "Ed25519VerificationKey2018",
			"controller": "did:example:123456789abcdefghi",
			"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
		}],
		"service": [{
			"id":"did:example:123456789abcdefghi#vcs",
			"type": "VerifiableCredentialService",
			"serviceEndpoint": "https://example.com/vc/"
		}]
	},
	"didUrlDereferencingMetadata": {
		"contentType": "application/did",
		"retrieved": "2024-06-01T19:73:24Z",
	},
	"contentMetadata": {
		"created": "2019-03-23T06:35:22Z",
		"updated": "2023-08-10T13:40:06Z",
		"method": {
			"nymResponse": {
				"result": {
					"data": "{\"dest\":\"WRfXPg8dantKVubE3HX8pw\",\"identifier\":\"V4SGRU86Z58d6TV7PBUe6f\",\"role\":\"0\",\"seqNo\":11,\"txnTime\":1524055264,\"verkey\":\"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV\"}",
					"type": "105",
					"txnTime": 1.524055264E9,
					"seqNo": 11.0,
					"reqId": 1.52725687080231475E18,
					"identifier": "HixkhyA4dXGz9yxmLQC4PU",
					"dest": "WRfXPg8dantKVubE3HX8pw"
				},
				"op": "REPLY"
			},
			"attrResponse": {
				"result": {
					"identifier": "HixkhyA4dXGz9yxmLQC4PU",
					"seqNo": 12.0,
					"raw": "endpoint",
					"dest": "WRfXPg8dantKVubE3HX8pw",
					"data": "{\"endpoint\":{\"xdi\":\"http://127.0.0.1:8080/xdi\"}}",
					"txnTime": 1.524055265E9,
					"type": "104",
					"reqId": 1.52725687092557056E18
				},
				"op": "REPLY"
			}
		}
	}
}

11. エラー

本仕様で説明されるアルゴリズムは、特定の種類のエラーを投げる。 実装者は、これらのエラーを他のライブラリまたはソフトウェアシステムへ 伝達することが有用であると考える可能性がある。この節では、 本仕様で説明される技術を実装するエコシステムが、エラー発生時により効果的に 相互運用できるように、エラーの具体的なURLおよび説明を提供する。 さらに、本仕様は [CID]仕様の 第3.5節 処理エラーで 定義される一部のエラーを使用する。

実装者は、エラーデータ構造をエンコードするために[RFC9457]を使用すべき SHOULDである。 [RFC9457]が使用される場合:

INVALID_DID
無効なDIDがDID解決中に検出された。 4.4 DID解決 アルゴリズムを参照。
https://www.w3.org/ns/did#INVALID_DID
INVALID_DID_DOCUMENT
DID文書の 形式が不正であった。4.4 DID解決 アルゴリズムを参照。
https://www.w3.org/ns/did#INVALID_DID_DOCUMENT
NOT_FOUND
DIDリゾルバーは、 この解決要求の結果として得られる DID文書を 見つけられなかった。4.4 DID 解決アルゴリズムを参照。
https://www.w3.org/ns/did#NOT_FOUND
REPRESENTATION_NOT_SUPPORTED
acceptDID URL参照解決オプションを通じて要求された 表現は、 DIDメソッドおよび/または DID URL 参照解決器実装によってサポートされていない。5.4 DID URL参照解決 アルゴリズムを参照。
https://www.w3.org/ns/did#REPRESENTATION_NOT_SUPPORTED
INVALID_DID_URL
無効なDID URLDID URL 参照解決中に検出された。5.4 DID URL参照解決 アルゴリズムを参照
https://www.w3.org/ns/did#INVALID_DID_URL
METHOD_NOT_SUPPORTED
DIDのDIDメソッドが DIDリゾルバーによって サポートされていない。4.4 DID解決 アルゴリズムを参照。
https://www.w3.org/ns/did#METHOD_NOT_SUPPORTED
INVALID_OPTIONS
DID解決または DID URL 参照解決に対して提供されたオプションの1つ以上が 無効である。
https://www.w3.org/ns/did#INVALID_OPTIONS
INTERNAL_ERROR
DID解決または DID URL 参照解決中に予期しないエラーが発生した。
https://www.w3.org/ns/did#INTERNAL_ERROR
FEATURE_NOT_SUPPORTED
DIDリゾルバーは、 要求された機能をサポートしていない。detailフィールドの値は、 そのリゾルバーによってサポートされていない機能について、より長い説明を 提供すべきSHOULDである。
https://www.w3.org/ns/did#FEATURE_NOT_SUPPORTED

12. バインディング

この節では、 4. DID解決および5. DID URL参照解決の節における 抽象アルゴリズムのためのバインディングを定義する。

12.1 HTTP(S)バインディング

この節では、 DIDリゾルバー バインディングを 定義する。このバインディングは、 DID解決 および/またはDID URL 参照解決関数 (すべての解決/参照解決オプションおよびメタデータを含む)を、HTTP(S) エンドポイントを介して公開する。8.2 リゾルバー アーキテクチャを参照。

注記

HTTP(S)リゾルバーを使用すると、リモート当事者への依存が生じ、 RefererOriginCookies、および Authorizationなどの各種HTTPヘッダーが含まれることにより、 要求者のプライバシーが低下する可能性がある。さらに、 クライアントDIDリゾルバー の間のコンポーネントによるキャッシュは、要求のプライバシーをさらに低下させる可能性がある。

HTTP(S)バインディングは、 DIDリゾルバーを 呼び出すことができる既知のHTTP(S) URLを必要とする。このURLは DIDリゾルバー HTTP(S)エンドポイントと呼ばれる。

このバインディングは一般に リモートバインディングと見なされるが、HTTP(S)エンドポイントが localhost上などのローカル環境で実行される場合には、 ローカルバインディングでもあり得る。

すべての適合DIDリゾルバーは、 HTTPS バインディングのGET版を実装しなければMUSTならず、 POST版を実装してもMAYよい。すべてのHTTPS バインディングはTLSを使用しなければMUSTならない。 証明書でDNS名を使用することはNOT REQUIREDであり、 リゾルバーはIPアドレスに対して発行されたTLS証明書を使用してもMAYよい。

このバインディングを使用して、 DID解決関数( 4. DID解決を参照)および/または DID URL 参照解決関数 (5. DID URL参照解決を参照)は、 次のように実行できる。

  1. 要求HTTP(S) URLDID リゾルバーHTTP(S)エンドポイントで初期化する。
    https://resolver.example/1.0/identifiers/
  2. DID 解決関数について:
    1. 入力DID要求HTTP(S) URLに追加する。
      https://resolver.example/1.0/identifiers/did:example:1234
    2. 完全な 9. DID解決 結果を要求するために、 AcceptHTTP要求ヘッダーapplication/did-resolutionに設定する、または
    3. 結果のdidDocument値のみを要求するために、 AcceptHTTP要求ヘッダーaccept解決オプションの値に設定する。
  3. DID URL参照解決関数について:
    1. 入力DID URL要求HTTP(S) URLに追加する。
      https://resolver.example/1.0/identifiers/did:example:1234?service=files&relativeRef=/resume.pdf
    2. 完全な 10. DID URL 参照解決結果を要求するために、 AcceptHTTP要求ヘッダーapplication/did-url-dereferencingに設定する、または
    3. 結果の contentStream値のみを要求するために、 AcceptHTTP要求ヘッダーaccept 参照解決オプションの値に設定する。
  4. HTTP(S) GETバインディングについて:
    1. accept以外の解決オプションまたは 参照解決オプションが提供されている場合:
      1. 入力DIDは、 (RFC3986第2.1節で 指定されるように)URLエンコードされなければ MUSTならない。
      2. acceptを除くすべての解決オプションを、 要求HTTP(S) URL内のクエリパラメーターとしてエンコードする。
    2. 要求HTTP(S) URLに対してHTTP GET要求を実行する。 これは、リモート DID リゾルバーにおける DID 解決または DID URL参照解決関数を呼び出す。
      GET https://resolver.example/1.0/identifiers/did%3Aexample%3A1234?option1=value1&option2=value2 HTTP/1.1
      Accept: application/did-resolution
      GET https://resolver.example/1.0/identifiers/did%3Aexample%3A1234%3Fservice%3Dfiles%26relativeRef%3D%2Fresume.pdf?option1=value1&option2=value2 HTTP/1.1
      Accept: application/did-url-dereferencing
  5. HTTP(S) POSTバインディングについて:
    1. accept以外の解決オプションまたは 参照解決オプションが提供されている場合:
      1. acceptを除くすべての解決オプションを、 HTTP要求のPOST本文内のJSON構造としてエンコードする。
    2. 要求HTTP(S) URLに対してHTTP POST要求を実行する。 これは、リモート DID リゾルバーにおける DID 解決または DID URL参照解決関数を呼び出す。
      POST https://resolver.example/1.0/identifiers/did:example:1234 HTTP/1.1
      Accept: application/did-resolution
      
      {
      "option1": "value1",
      "option2": "value2"
      }
      POST https://resolver.example/1.0/identifiers/did:example:1234?service=files&relativeRef=/resume.pdf HTTP/1.1
      Accept: application/did-url-dereferencing
      
      {
      "option1": "value1",
      "option2": "value2"
      }
  6. DID 解決または DID URL 参照解決関数が、 didResolutionMetadataまたはdereferencingMetadata内で errorメタデータプロパティを返す場合、 HTTP応答ステータスコードは、次の表に従って エラーオブジェクトtypeプロパティに対応しなければ MUSTならない。
    error type URI HTTPステータスコード
    https://www.w3.org/ns/did#INVALID_DID 400
    https://www.w3.org/ns/did#INVALID_DID_URL 400
    https://www.w3.org/ns/did#INVALID_OPTIONS 400
    https://www.w3.org/ns/did#NOT_FOUND 404
    https://www.w3.org/ns/did#REPRESENTATION_NOT_SUPPORTED 406
    https://www.w3.org/ns/did#INVALID_DID_DOCUMENT 500
    https://www.w3.org/ns/did#METHOD_NOT_SUPPORTED 501
    https://www.w3.org/ns/did#FEATURE_NOT_SUPPORTED 501
    https://www.w3.org/ns/did#INTERNAL_ERROR 500
    (その他の任意のエラーURI) 500
  7. DID 解決または DID URL 参照解決関数が、 didDocumentMetadataまたは contentMetadata内で、値 trueを持つ deactivatedメタデータプロパティを返す場合:
    1. HTTP応答ステータスコードは410でなければMUSTならない。
  8. DID 解決関数について:
    1. Content-Type HTTP応答ヘッダーの値がapplication/did-resolutionである場合:
      1. HTTP本文は、 DID解決結果9. DID 解決結果を参照)であって、 DID解決 関数の結果であるものを含まなければ MUSTならない。
    2. 関数が成功し、didDocumentを返す場合:
      1. HTTP応答ステータスコードは200でなければMUSTならない。
      2. HTTP応答はContent-Type HTTP応答ヘッダーを含まなければMUSTならない。 その値は、 didResolutionMetadata内の contentTypeメタデータプロパティの値でなければ MUSTならない( 4.2 DID 解決メタデータを参照)。
      3. HTTP応答本文は、 DID解決 関数の結果である didDocumentを、 Content-TypeHTTP応答ヘッダーに対応する 表現で含まなければMUSTならない。
  9. DID URL参照解決関数について:
    1. Content-TypeHTTP応答ヘッダーの値が application/did-url-dereferencingである場合:
      1. HTTP本文は、 DID URL参照解決結果10. DID URL参照解決結果を参照)であって、 DID URL 参照解決関数の結果であるものを含まなければ MUSTならない。
    2. 関数が成功し、 contentStreamと、値text/uri-listを持つ contentTypeメタデータプロパティを dereferencingMetadata内に返す場合:
      1. HTTP応答ステータスコードは303でなければMUSTならない。
      2. HTTP応答は Locationヘッダーを含まなければMUSTならない。 このヘッダーの値は、選択済みDIDサービス エンドポイントURLでなければMUSTならない。
      3. HTTP応答本文は空でなければMUSTならない。
    3. 関数が成功し、その他の任意のcontentTypeを持つ contentStreamを返す場合:
      1. HTTP応答ステータスコードは200でなければMUSTならない。
      2. HTTP応答はContent-Type HTTP応答ヘッダーを含まなければMUSTならない。 その値は、 dereferencingMetadata内の contentTypeメタデータプロパティの値でなければ MUSTならない( 5.2 DID URL参照解決メタデータを参照)。
      3. HTTP応答本文は、 DID URL 参照解決関数の結果である contentStreamを、 Content-TypeHTTP応答ヘッダーに対応する 表現で含まなければMUSTならない。
注記

HTTP(S)バインディングに対応するOpenAPI定義については、こちらを参照。

12.2 DID解決の例

次の DIDリゾルバー HTTP(S)エンドポイントが与えられた場合:

https://resolver.example/1.0/identifiers/

そして次の 入力DIDが 与えられた場合:

did:example:123

その場合、要求HTTP(S) URLは次のとおりである。

https://resolver.example/1.0/identifiers/did:example:123

12.2.1 例: DID解決結果を返す

resolve()関数は、HTTP(S) バインディングを介して次のように呼び出せる。

30: HTTP(S) バインディングを介したDIDリゾルバーへの要求の例
GET https://resolver.example/1.0/identifiers/did:example:123 HTTP/1.1
Accept: application/did-resolution

応答は次のとおりである。

31: HTTP(S)バインディングを介した DIDリゾルバーからの応答の例
HTTP 200 OK
Content-Type: application/did-resolution

{
	"didDocument": {
		"@context": [ "https://www.w3.org/ns/did/v1.1" ],
		"id": "did:example:123",
		"verificationMethod": [{
			...
		}],
		"service": [{
			...
		}]
	},
	"didResolutionMetadata": {
		"contentType": "application/did"
	},
	"didDocumentMetadata": {
		...
	}
}

12.2.2 例: DID文書を返す

resolve()関数は、HTTP(S) バインディングを介して次のように呼び出せる。

32: HTTP(S) バインディングを介したDIDリゾルバーへの要求の例
GET https://resolver.example/1.0/identifiers/did:example:123 HTTP/1.1
Accept: application/did

応答は次のとおりである。

33: HTTP(S)バインディングを介した DIDリゾルバーからの応答の例
HTTP 200 OK
Content-Type: application/did

{
	"@context": [ "https://www.w3.org/ns/did/v1.1" ],
	"id": "did:example:123",
	"verificationMethod": [{
		...
	}],
	"service": [{
		...
	}]
}

12.3 DID URL参照解決の 例

12.3.1 例: DID URL参照解決結果を返す

dereference()関数は、 HTTP(S)バインディングを介して次のように呼び出せる。

34: HTTP(S)バインディングを介した DID URL参照解決器への要求の例
GET https://resolver.example/1.0/identifiers/did:example:123?versionId=2 HTTP/1.1
Accept: application/did-url-dereferencing

応答は次のとおりである。

35: HTTP(S)バインディングを介したDID URL参照解決器からの 応答の例
HTTP 200 OK
Content-Type: application/did-url-dereferencing

{
	"content": {
		"@context": [ "https://www.w3.org/ns/did/v1.1" ],
		"id": "did:example:123",
		"verificationMethod": [{
			...
		}],
		"service": [{
			...
		}]
	},
	"dereferencingMetadata": {
		"contentType": "application/did"
	},
	"contentMetadata": {
		...
	}
}

12.3.2 例: リソースを返す

dereference()関数は、 HTTP(S)バインディングを介して次のように呼び出せる。

36: HTTP(S)バインディングを介した DID URL参照解決器への要求の例
GET https://resolver.example/1.0/identifiers/did:example:123?versionId=2 HTTP/1.1
Accept: application/did

応答は次のとおりである。

37: HTTP(S)バインディングを介したDID URL参照解決器からの 応答の例
HTTP 200 OK
Content-Type: application/did

{
	"@context": [ "https://www.w3.org/ns/did/v1.1" ],
	"id": "did:example:123",
	"verificationMethod": [{
		...
	}],
	"service": [{
		...
	}]
}

13. セキュリティ上の考慮事項

この節には、本番環境でDID解決を使用する人々が検討することを推奨される、 さまざまなセキュリティ上の考慮事項が含まれる。読者は、この節を読む前に、 Decentralized Identifiers仕様の セキュリティ上の考慮事項の節で提供される一般的なセキュリティ助言に 慣れておくことが強く推奨される。

13.1 認証/認可

DID解決および DID URL 参照解決には、 認証または認可機能は含まれない。DNS解決と同様に、誰でも資格情報や非公開の知識を 必要とせずにこのプロセスを実行できる。

13.2 キャッシュ

DIDリゾルバーは、 DID文書の 汎用キャッシュを保持することがある。また、特定の DIDメソッドに 固有のキャッシュを保持することもある。

noCache解決オプションは、特定の種類のキャッシュ動作を要求するために 使用できる。

この解決オプションOPTIONALである。

このプロパティの可能な値は次のとおりである。

キャッシュ動作は、 DIDリゾルバーの 設定、noCache解決オプション、またはDID 文書の内容(例: cacheMaxTtlフィールド)、あるいはこれらの プロパティの組み合わせによって制御できる。

noCacheを実装するリゾルバーは、悪意あるクライアントがキャッシュを迂回して 高コストのネットワーク要求およびリソース消費を強制できるため、サービス拒否攻撃に対して より脆弱になる可能性がある。noCacheを用いて解決を要求するクライアントは、 一部のリゾルバーがキャッシュを迂回する解決要求を拒否することを想定する。 キャッシュなしの解決を拒否するリゾルバーは、キャッシュの迂回が許可されなかったことを 明確に示すFEATURE_NOT_SUPPORTEDエラーで応答しなければ MUSTならない。これにより、クライアントはnoCacheを使用せずに 解決を試みることができる。

13.3 JSON-LDコンテキストの完全性

JSON-LD Context ファイルがリモートの場所から取得される場合、攻撃者がコンテキスト ファイルを改変する可能性がある(たとえば、サーバーを侵害すること、または 中間者攻撃により要求を傍受することによって)。

したがって、JSON-LD Context URLのリモート取得を実行する DID リゾルバーは、エンドツーエンドのセキュリティを確保する助けとして、 コンテキストファイルおよび対応するハッシュのレジストリ(または機能的に同等の仕組み)を 使用することが強く推奨される。実装は、リソースの暗号学的ハッシュ値が 期待されるハッシュ値と一致しない場合、エラーを投げることが期待される。

13.4 バージョニング

versionIdまたは versionTimeDID パラメーターが提供された場合、DID解決アルゴリズムは、 DID文書の特定のバージョンを返す。

DIDパラメーターversionIdおよび versionTimeは相互に排他的である。

versionId DIDパラメーターの使用は、DIDメソッドに固有である。 その可能な値には、連番、ランダムUUID、コンテンツハッシュなどが含まれ得る。

DID文書メタデータは、DID文書に対して実行される各 Update 操作ごとに変化するversionIdプロパティを含んでも MAYよい。

注記

ほとんどのDID メソッドUpdate 操作に対応しているが、 DIDメソッドが以前のすべての DID文書 バージョンを保持する要件はないため、すべての DIDメソッドが バージョニングに対応しているわけではない。

13.5 VDRネットワークフォーク

分散システム(分散台帳など)をVDR(検証可能データレジストリ)として 使用するDIDメソッドは、 ネットワークフォークが発生する可能性を管理する必要がある。したがって、 分散システムをVDRとして使用する DIDメソッドの仕様は、 使用しているVDRをそのようなフォークから曖昧さなく識別する手段を指定すべき SHOULDである。

13.6 参照解決の循環

DID URL 参照解決器クライアントが、 DID文書内の識別子およびリンクされた リソース、特にverificationMethodcontroller、 またはalsoKnownAsなどのフィールドを参照解決する場合、 参照解決の循環に遭遇することがある。 これは、DID文書が 別のDID(またはURL)を参照し、それが最終的に以前に参照解決された識別子に 戻ってループを形成する場合に発生することがある。 DID URL参照解決器は、 DIDサービスエンドポイントを 参照するDID URLを 参照解決する場合にも、そのような状況に遭遇することがある。

did:example:alice
	└── verificationMethod.controller → did:example:bob
		└── verificationMethod.controller → did:example:alice

再帰的な参照解決を実行するDID URL 参照解決器およびそのクライアントは、 そのような循環を想定し、検出し、処理することが期待される

セキュリティおよび性能上のリスク: 循環が検出されず緩和されない場合、 再帰的な参照解決は次につながる可能性がある。

緩和の指針: 外部のDID 文書参照を再帰的にたどるコンポーネントは、 すでに参照解決された識別子を追跡し、循環が発生したときに検出して 適切な処置を取ることが推奨される。さらに、開発者は潜在的な攻撃対象領域を減らすために、 再帰の深さまたは幅を制限したい場合がある。

13.7 クエリ文字列の 正規化とインジェクションリスク

この節は非規範的である。

DID URLのクエリ構成要素は、解決および参照解決の動作に影響するDID パラメーターを渡すために使用される( 3. DIDパラメーターを参照)。 クエリ文字列処理のいくつかの側面にはセキュリティ上の含意があり、 実装者は慎重に検討することが推奨される。

13.7.1 relativeRefによるパストラバーサル

relativeRefDIDパラメーターのパーセントデコードされた値は、 RFC3986第5節で 定義される参照解決アルゴリズムを使用して、serviceEndpoint URLを基底URIとして 結合され、最終的なリソースURLを構築する(5.4.1 リソースの参照解決を参照)。relativeRefの値に パストラバーサルシーケンスが含まれる場合、攻撃者は参照解決器に、サービスエンドポイントの 意図されたパス範囲を脱出するリソースURLを構築させられる可能性がある。

パストラバーサルは、さまざまなエンコーディングを使用して試みられる可能性がある。 次は、攻撃者が使用する可能性のあるシーケンスの非網羅的な例である。

  • リテラルのdot-dot-slash: ../
  • パーセントエンコードされた変種: %2E%2E%2F, %2E%2E/, .%2E/, %2E./
  • 二重エンコードされた変種: %252E%252E%252F
  • プラットフォーム固有の変種(例: Windows由来のパスライブラリにおける..\

実装者には次が推奨される。

  • RFC3986第5節の 参照解決アルゴリズムを適用した後に、解決済みパスを正規化し、 結果のパスがサービスエンドポイントURLの基底パスより上へ トラバースしていないことを検証する。
  • 正規化後に、serviceEndpoint URLの基底パスを接頭辞として持たない パスのリソースURLを生成するrelativeRef値を無効な入力として扱う。 たとえば、INVALID_DID_URLエラーを返す( 11. エラーを参照)。
  • エンコードされたトラバーサル変種を防ぐため、完全なパーセントデコード後に 正規化と検証を適用する。表面的な文字列照合(例: リテラル文字列../のみを確認すること)は、信頼できる トラバーサル検出メカニズムではない。
注記: relativeRef解決の循環

この懸念は、サービスエンドポイントURL自体が再帰的に参照解決されるDID URLである場合に特に深刻である。そのような場合、 relativeRef内のトラバーサルシーケンスは、意図されたものとは異なる DID文書の解決に影響を与える可能性がある。13.6 参照解決の循環も参照。

13.7.2 キャッシュバイパスベクトルとしての正規化の不一致

3.2 クエリ 正規化で説明されるように、同じ論理的な DID URLは、 構文的に異なる複数の文字列で表現され得る。プロキシされた、または複数コンポーネントの 解決アーキテクチャ(8.2.2 プロキシされた 解決を参照)では、異なるコンポーネントが異なる 正規化規則を適用する(または正規化をまったく適用しない)可能性がある。

コンポーネント間の正規化の不一致を認識している攻撃者は、次のことができる可能性がある。

  • あるコンポーネントではキャッシュから提供されるが、別のコンポーネントでは 検証可能データ レジストリから再参照解決される DID URLを構築し、キャッシュされた 応答に関連付けられたコンテンツ完全性チェックを迂回する可能性がある。
  • 論理的に同一の2つのDID URLを 別個のエントリとしてキャッシュさせ、キャッシュサイズを膨らませ、キャッシュ 枯渇を可能にする可能性がある。
  • キャッシュプロキシと上流リゾルバーの間で重複パラメーター処理が異なることを悪用し、 解決要求に予期しないパラメーター値を注入する可能性がある。

これらのリスクを緩和するため、実装者には次が推奨される。

  1. 解決パイプラインの最外部の入口点で、キャッシュまたは転送が発生する前に、 (3.2 クエリ正規化に従って) クエリ文字列の正規化を適用する。
  2. DID URLの正規化形式を キャッシュキーとして使用し、適用された正規化アルゴリズムを文書化する。
  3. 上流コンポーネントから受信したDID URLが すでに正規化されていると仮定しない。処理前に独立して正規化を適用する方が より安全なアプローチである。

13.7.3 連結による パラメーターインジェクション

文字列連結によって(たとえば、呼び出し元が提供した値をDID パラメーターとして追加することにより)プログラム的に DID URLを構築する実装は、 連結前に入力が検証およびエンコードされない場合、パラメーターインジェクションに 脆弱になる可能性がある。

たとえば、呼び出し元が提供するservicefiles&versionId=2は、エンコードせずに連結された場合、 追加のversionIdパラメーターを DID URLに注入し、 呼び出し元が意図または認可していない方法で解決動作を変更する可能性がある。 これはHTTPベースのシステムにおけるクエリ文字列インジェクション脆弱性に類似している。

実装者には、DID URLクエリ文字列へ連結する前に、呼び出し元が提供するすべての パラメーター値をRFC3986第2.1節に従って パーセントエンコードし、デコード後のパラメーター値が、 本仕様(3. DID パラメーターを参照)、適用されるDID メソッド仕様、またはDID Document Resolution Extensions [DID-EXTENSIONS-RESOLUTION]で定義される、 そのパラメーターの期待される値形式に適合することを検証することが推奨される。

14. プライバシー上の考慮事項

この節では、DID解決に固有のプライバシー上の考慮事項を詳述する。 読者は、この節を読む前に、 Decentralized Identifiers仕様 およびControlled Identifiers仕様の プライバシー上の考慮事項の節で提供される一般的なプライバシー助言に 慣れておくことが強く推奨される。

14.1 DID解決および参照解決要求者のプロファイリング

DIDリゾルバーおよび DID URL 参照解決器は、 解決および参照解決のための自サービスへの要求をログに記録できる。 時間の経過とともに、これらのログは、それらのサービスに要求を行うクライアントを 追跡およびプロファイリングするために使用される可能性がある。このプライバシーリスクを 緩和するため、クライアントは、たとえば既存のビジネス関係がある、またはそのサービスが 自身の管理下にあるインフラストラクチャ上で実行されているなどの理由で、 信頼するサービスにそのような要求を行うべきである。

クライアントは、相関およびプロファイリングの可能性を低減するために、 サービスへの要求を難読化する手段を取ることもできる。難読化の技術には、 Oblivious HTTP、信頼されたプロキシを使用して解決要求を実行すること、および 信頼されたキャッシュを使用することが含まれる。

14.2 メソッド固有の 考慮事項

DIDメソッドごとに、設計上の判断およびそのメソッドの基礎となるVDRに応じて、 異なる追加のプライバシー上の含意および考慮事項がある。実装者は、 サポートしようとする特定のDIDメソッドのプライバシー上の考慮事項を確認することが 推奨される。DIDメソッドの設計者には、 実装者がそのメソッド設計のプライバシー上の含意を理解する助けとなる脅威モデルを作成するため、 W3C Threat Modeling Guideに従うことが 推奨される。

A. 他の技術との関係

インターネット上のアドレスへ識別子を解決するために使用される最も一般的な仕組みの1つは、 [RFC1034]で説明される グローバルなDomain Name System(DNS)である。 Domain NameをInternet Protocolアドレスへ対応付けるために使用されるDNSおよびプロセスとシステムは、 Webサイトをホストするための一般的な要件である。

Decentralized Identifiers (DIDs) v1.0仕様は、グローバルなDomain Name Systemへの依存を一切持たない 新しい種類の識別子を導入し、アーキテクチャのいかなる部分の中央集権化も必要としない 識別子解決プロセスの概念を導入した。この新しいアーキテクチャにより、 識別子のレントシーキングおよび検閲に対抗する、グローバルに解決可能な識別子の 分散的な作成および管理が可能になる。これにより個人は、第三者から識別子を 借りるのではなく、自身の識別子を完全に所有し制御できるようになる。

DID URLを取得した個人は、DNSベースのURLを引き続き使用するのとよく似た形で、 それらを自身のソフトウェアで使用する。そのソフトウェアは、取得されるべき リソースの場所を決定するために、(本仕様で定義される) DIDリゾルバーインターフェイスを 使用する。DID解決のプロセスは、DNS 解決のプロセスと非常によく似て、個人には不透明であり、個人の直接的な関与を必要とせずに ソフトウェア内で行われる。

DNSの中央集権化に関連する研究、ならびにそれに対応する DIDおよびDID解決の発明は、 Decentralized Identifiers (DIDs) v1.0 仕様の DIDの歴史に関する節で文書化されている。

B. DID解決リソース

  1. DID Core仕様におけるDIDリゾルバー
  2. Universal Resolver
  3. did-client
  4. uPort DIDリゾルバー

C. 参考文献

C.1 規範的参考文献

[CID]
制御識別子 v1.0. Michael Jones; Manu Sporny. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/cid-1.0/
[DID-CORE]
分散型識別子(DID)v1.0. Manu Sporny; Amy Guy; Markus Sabadello; Drummond Reed. W3C. 2022年7月19日. W3C 勧告. URL: https://www.w3.org/TR/did-core/
[INFRA]
Infra 標準. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2046]
多目的インターネットメール拡張 (MIME)第2部:メディアタイプ. N. Freed; N. Borenstein. IETF. 1996年11月. 標準 草案. URL: https://www.rfc-editor.org/info/rfc2046/
[RFC2119]
要求レベルを示すために RFC で使用する キーワード. S. Bradner. IETF. 1997年3月. 現行の最良の慣行. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC3986]
統一資源識別子(URI):汎用 構文. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005年1月. インターネット 標準. URL: https://www.rfc-editor.org/info/rfc3986/
[RFC3987]
国際化資源識別子 (IRI). M. Duerst; M. Suignard. IETF. 2005年1月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc3987/
[RFC8174]
RFC 2119 のキーワードにおける大文字と小文字の 曖昧さ. B. Leiba. IETF. 2017年5月. 現行の最良の慣行. URL: https://www.rfc-editor.org/info/rfc8174/
[RFC9110]
HTTP セマンティクス. R. Fielding, 編; M. Nottingham, 編; J. Reschke, 編. IETF. 2022年6月. インターネット標準. URL: https://httpwg.org/specs/rfc9110.html
[RFC9457]
HTTP API の問題詳細. M. Nottingham; E. Wilde; S. Dalal. IETF. 2023年7月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc9457/
[VC-DATA-MODEL]
検証可能な資格情報データモデル v2.0. Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/vc-data-model-2.0/

C.2 参考情報

[DID-EXTENSIONS-PROPERTIES]
DID 文書プロパティ 拡張. Manu Sporny; Markus Sabadello. W3C. 2025年12月11日. W3C ワーキング グループノート. URL: https://www.w3.org/TR/did-extensions-properties/
[DID-EXTENSIONS-RESOLUTION]
DID 解決 拡張. Manu Sporny; Markus Sabadello. W3C. 2024年11月19日. W3C ワーキング グループノート. URL: https://www.w3.org/TR/did-extensions-resolution/
[DID-KEY]
did:key メソッド. Manu Sporny; Dmitri Zagidulin; Dave Longley. 2025年3月26日. CG-DRAFT. URL: https://w3c-ccg.github.io/did-key-spec/
[KERI]
鍵イベント受領基盤(KERI). Samuel M. Smith. 2019年7月. URL: https://arxiv.org/abs/1907.02143
[RFC1034]
ドメイン名 ― 概念と 機能. P. Mockapetris. IETF. 1987年11月. インターネット標準. URL: https://www.rfc-editor.org/info/rfc1034/
[RFC4122]
汎用一意識別子(UUID)の URN 名前空間. P. Leach; M. Mealling; R. Salz. IETF. 2005年7月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc4122/
[RFC7231]
ハイパーテキスト転送プロトコル(HTTP/1.1): セマンティクスおよびコンテンツ. R. Fielding, 編; J. Reschke, 編. IETF. 2014年6月. 標準化提案. URL: https://httpwg.org/specs/rfc7231.html