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

Content Attestation

注記

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

その理由は、CSS セレクターの対象要素の変更や Visible Text within DOM Integrityのようにレンダリング済みのテキストを 署名対象とするアルゴリズムが 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)。他に以下のプロパティを含みます。

プロパティ​

Content Attestation (CA) のプロパティ一覧​

NameTypeDescription
@contextstring[]REQUIRED. OP VC Data Model に従ってください (MUST)。
typestring[]REQUIRED. 必ず ["VerifiableCredential", "ContentAttestation"] にしてください (MUST)。
issuerstringREQUIRED. CA 発行者の OP ID でなければなりません (MUST)。
credentialSubjectobjectREQUIRED. 次のcredentialSubject のプロパティを含む JSON-LD Node Object です。
allowedUrlstring | string[]REQUIRED. この CA によって表明される情報の対象となる URL です。必ず URL Pattern string またはその配列でなければなりません (MUST)。空配列にしてはなりません (MUST NOT)。各 URL Pattern string はスキームとホスト名の制約を満たさなければなりません (MUST)。このプロパティで CA が正当な URL の Web ページに設置されているかどうかを検証することができます。
targetobject[]REQUIRED. Content Integrity Descriptor の配列でなければなりません (MUST)。Content Integrity Descriptor はコンテンツの一部の完全性を保証するための仕組みです。このプロパティで CA と対応するコンテンツ内の特定の情報が改ざんされていないかを検証することができます。Content Integrity Type Registryに登録されているものを使用できます。

credentialSubject のプロパティ一覧​

NameTypeDescription
idstringREQUIRED. CA ID でなければなりません (MUST)。 CA ID は UUIDv4 の URN 形式の文字列です。コンテンツと CA ID は一対一対応します。
typestringREQUIRED. CA のタイプ名です。既存の型は Content Attestation Type Registry に登録されており、必要に応じて拡張して新しい型を定義できます (MAY)。
注記

VC の署名の有効期間 (iat, exp) の運用上の扱いについては OP, SP, CA の有効期間 を参照してください。

allowedUrl のスキームとホスト名の制約​

allowedUrl は CA を特定のサイトの Web ページに結びつけるためのプロパティです。 スキームやホスト名を任意にしたパターンはあらゆるサイトの URL に一致し、この結びつきを失わせます。 そのため、各 URL Pattern string のスキームとホスト名は次の条件を満たさなければなりません (MUST)。

  • スキームは https です。ただし、ローカル環境での開発のため、ホスト名が localhost の場合に限り http を使えます (MAY)。
  • ホスト名は RFC 1123 Section 2.1 に従う固定のホスト名です。サブドメインを任意にするため、先頭に *. を付けられます (MAY)。それ以外のワイルドカード、名前付きグループ、正規表現は使えません。

ポート番号、パス、クエリには、URL Pattern の構文を自由に使えます。

allowedUrl の具体例​

✅ 有効:

  • 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/( (構文エラー)
  • https://*/* (ホスト名が任意)
  • *://example.com/*、http{s}?://example.com/* (スキームが https に固定されていない)
  • https://example.(com|net)/* (ホスト名に正規表現を使っている)
  • [] (空配列)
注記

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

メディアタイプ​

Securing Mechanism で保護した単体の CA のメディアタイプは application/ca+jwt です (Media Types)。

例​

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

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 および本文書に未定義のプロパティを追加してもよいです (MAY) が、その場合は登録プロセスに従ってください (MUST)。

備考

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)メソッドを使います。 スキームとホスト名の制約を満たさない URL Pattern string は、URL と一致しないものとします (MUST)。
注記

パーセントエンコードは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 Inspector」では、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)