メインコンテンツまでスキップ

Content Attestation Data Model

注記

CAの検証対象として検討したのは、(1) ページロード完了時に利用者の能動的な確認操作などに起因する特定イベントベースでの検証、 (2) リアルタイムでの動的な DOM の読み込み・書き換え中の検証であるが、(2)のリアルタイム性の高いタイミングはCAの検証対象として想定外としている。

その理由は、CSS セレクターの対象要素の変更や Visible Text Targetのようにレンダリング済みのテキストを 署名対象とするアルゴリズムが DOM 書き換え中のリアルタイム検証とは相性が悪いこと、 ブラウザの性能/消費電力に対するインパクトがあるからである。

OPが想定する情報発信者の検証は、危険なサイトのページに埋め込まれたブロックとは異なり、読み込みすること自体を避けるセキュリティ上の必要性まではない。前述の通りレンダリング済みテキストを対象とする署名検証アルゴリズムを含めており検証タイミングの制約があるし、読み込み/レンダリングはブロックせず読み込み後に検証した上で、 検証が通らない場合には対象コンテンツを一旦隠し警告を表示するなど、読込のブロック以外のブラウザの振る舞いも考え得る。以上より、CAの検証タイミングとしては現状、読込時点やレンダリング処理中などリアルタイム性の高いタイミングは想定外としている。

用語

本文書に説明のない用語については、用語を参照してください。

  • Originator Profile (OP)
  • Originator Profile Identifier (OP ID)
  • Content Attestation (CA)
  • Content Integrity Descriptor

Content Attestation (CA) のデータモデル

Content Attestation は OP VC DM 準拠文書でなければなりません (MUST)。他に以下のプロパティを含みます。

プロパティ

@context

OP VC Data Model に従ってください (MUST)。

type

REQUIRED. 必ず ["VerifiableCredential", "ContentAttestation"] にしてください (MUST)。

credentialSubject.id

REQUIRED. CA ID でなければなりません (MUST)。 CA ID は UUIDv4 の URN 形式の文字列です。コンテンツと CA ID は一対一対応します。

allowedUrl

REQUIRED. この CA によって表明される情報の対象となる URL です。 必ず URL Pattern string またはその配列でなければなりません (MUST)。 空配列にしてはなりません (MUST NOT)。 このプロパティで CA が正当な URL の Web ページに設置されているかどうかを検証することができます。

具体例:

✅ 有効:

  • https://example.com/article/* (ワイルドカードパターン)
  • https://*.example.com/article/* (サブドメインワイルドカード)
  • ["https://a.example.com/*", "https://b.example.com/*"] (複数パターンの配列)

❌ 無効:

  • /article/* (ベースURLが含まれていない)
  • example.com/* (https:// が指定されていない)
  • https://example.com/article/( (構文エラー)
  • [] (空配列)
注記

Webコンテンツ以外のURLを持たないコンテンツ (例: プライベートな非公開コンテンツ) を検証対象とする仕様拡張については今後の課題として検討中です。

target

REQUIRED. Content Integrity Descriptor の配列でなければなりません (MUST)。

Content Integrity Descriptor はコンテンツの一部の完全性を保証するための仕組みです。このプロパティで CA と対応するコンテンツ内の特定の情報が改ざんされていないかを検証することができます。 Content Integrity Type Registryに登録されているものを使用できます。

このセクションは非規範的です。

CA の具体例を示します。この CA は https://media.example.com/articles/2024-06-30 で公開されているコンテンツに紐づいています。

{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://originator-profile.org/ns/credentials/v1",
"https://originator-profile.org/ns/cip/v1",
{ "@language": "ja" }
],
"type": ["VerifiableCredential", "ContentAttestation"],
"issuer": "dns:example.com",
"credentialSubject": {
"id": "urn:uuid:78550fa7-f846-4e0f-ad5c-8d34461cb95b",
"type": "Article",
"headline": "<記事のタイトル>",
"image": {
"id": "https://media.example.com/image.png",
"digestSRI": "sha256-OYP9B9EPFBi1vs0dUqOhSbHmtP+ZSTsUv2/OjSzWK0w="
},
"description": "<Webページの説明>",
"author": ["山田花子"],
"editor": ["山田太郎"],
"datePublished": "2023-07-04T19:14:00Z",
"dateModified": "2023-07-04T19:14:00Z",
"genre": "Arts & Entertainment"
},
"allowedUrl": ["https://media.example.com/articles/2024-06-30"],
"target": [
{
"type": "VisibleTextTargetIntegrity",
"cssSelector": "<CSS セレクター>",
"integrity": "sha256-GYC9PqfIw0qWahU6OlReQfuurCI5VLJplslVdF7M95U="
},
{
"type": "ExternalResourceTargetIntegrity",
"integrity": "sha256-+M3dMZXeSIwAP8BsIAwxn5ofFWUtaoSoDfB+/J8uXMo="
}
]
}

この CA は https://ad.example.com 配下の Web ページに掲載されている広告コンテンツに紐づいています。

{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://originator-profile.org/ns/credentials/v1",
"https://originator-profile.org/ns/cip/v1",
{ "@language": "ja" }
],
"type": ["VerifiableCredential", "ContentAttestation"],
"issuer": "dns:example.com",
"credentialSubject": {
"id": "urn:uuid:78550fa7-f846-4e0f-ad5c-8d34461cb95b",
"type": "OnlineAd",
"name": "<広告のタイトル>",
"description": "<広告の説明>",
"image": {
"id": "https://ad.example.com/image.png",
"digestSRI": "sha256-5uQVtkoRdTFbimAz3Wz5GQcuBRLt7tDMD5JRtGFo9/M="
},
"landingPageUrl": "https://advertiser.example.com",
"adReportContact": {
"id": "https://ad.example.com/contact",
"name": "広告に対する報告窓口"
},
"adReviewGuidelines": {
"id": "https://ad.example.com/guidelines",
"name": "広告審査ガイドライン"
},
"targetingPolicy": {
"id": "https://ad.example.com/targeting",
"name": "ターゲティング広告に関するポリシー"
},
"adDataHandlingPolicy": {
"id": "https://ad.example.com/datahandling",
"name": "広告配信に関する情報の取り扱いについての説明"
},
"adDisplayRationale": {
"page": {
"id": "https://ad.example.com/rationale",
"name": "この広告が表示されている理由"
},
"description": "現在閲覧中のコンテンツと関連性が高いため。"
}
},
"allowedUrl": ["https://ad.example.com/*"],
"target": {
"type": "ExternalResourceTargetIntegrity",
"integrity": "sha256-rLDPDYArkNcCvnq0h4IgR7MVfJIOCCrx4z+w+uywc64="
}
}
注記

例には本文書に未定義のプロパティも含んでいます。未定義のプロパティを追加する方法については拡張性を参照してください。

拡張性

発行者は OP VC Data Model および本文書に未定義のプロパティを Content Attestation に追加してはなりません (MUST NOT) 。

発行者は OP VC Data Model および本文書に未定義のプロパティを追加してもよいです (MAY) が、その場合は Verifiable Credentials Data Model 2.0 セクション 5.2に従って拡張してください (RECOMMENDED)。

備考

Originator Profile 技術研究組合が開発するアプリケーションで使用されるプロパティについては、次の Originator Profile Blueprint (OPB) 文書を参照してください。

Content Integrity Descriptor の拡張性

Content Integrity Descriptor を参照してください。

検証プロセス

CA の検証者は次のことを検証することができます。

  1. OP VC Data Model に準拠した VC の検証
  2. allowedUrl の検証 (OPTIONAL)
  3. Content Integrity Descriptor の検証

allowedUrl の検証

検証者は次の手順に従って allowedUrl プロパティを検証できます (OPTIONAL)。

  1. CA が提示された Web ページの URL を取得します。
  2. allowedUrl プロパティの文字列と 1. で得た URL が一致するか確認します。アルゴリズムはURL Pattern の test(input, baseURL)メソッドを使います。
注記

パーセントエンコードはRFC 3986 Section 2.1に沿って大文字に正規化してから比較を行います

Content Integrity Descriptor の検証

検証者は target プロパティの Content Integrity Descriptor について、Content Integrity Descriptor のそれぞれの type で定めてある検証プロセスが実施可能である限り、検証すべきです (SHOULD)。

注記

Content Integrity Descriptor のタイプによっては、検証者の環境では検証が不可能な場合があります。たとえば、ブラウザによる描画が実行できない環境では、ブラウザによる描画結果が検証時必要な Content Integrity Descriptor は検証が不可能です。

検証者は Content Integrity Descriptor のタイプごとに定義される検証方法で検証しなければならず (MUST)、検証に失敗した場合にはその Content Integrity Descriptor の検証が失敗したことを閲覧者に提示してください (RECOMMENDED)。Content Integrity Descriptor の検証失敗を、 CA の検証失敗と同じまたはより高い深刻度 (Severity) でユーザーに表示することは避けてください (RECOMMENDED)。

検証結果の報告

このセクションは非規範的です。

検証実行後、その結果を適切にユーザーに伝える必要があります。以下は推奨される検証結果の報告方法です。

  • CA の検証に成功した場合、検証済みの CA としてユーザーに表示
  • CA の検証に失敗した場合、その種類と原因について簡潔な説明をユーザーに通知

「OP 拡張機能」では、CA の検証時、次のエラーを返却することがあります。

  • CaInvalid
  • CoreProfileNotFound
  • CaVerifyFailed
    • "Content Attestation verify failed" … OP VC Data Model に準拠した VC の検証失敗
    • "URL not allowed" … allowedUrl の検証失敗 (OPTIONAL)
    • "Target integrity verification failed" … Content Integrity Descriptor の検証失敗

その他のデータの構造については次のリファレンスをご確認ください。

  • 検証済み Content Attestation (CA)

入力:

  • Content Attestation (CA)
  • CA を提示した Web ページの URL (OPTIONAL)
  • 検証済み Originator Profile (OP)