IT-Wallet を動かす設定: 誰が何を設定するか
IT-Wallet の生態系 では、ウォレットとクレデンシャルがどう動くかを追いました。この記事では、それを実際に動かすために、各主体が何を設定するかを見ます。
IT-Wallet 技術仕様 v1.4.7(2026-09-22)に基づきます。JSON の例は仕様の例から、説明に必要な項目だけを抜き出したものです。
設定は 3 層に分かれる
どの主体の設定も、次の 3 層に分けて読むと整理できます。
| 層 | 答える問い | 中身 |
|---|---|---|
| ① Federation | あなたは誰か | Entity Configuration、Federation 鍵、上位への登録、Trust Mark |
| ② プロトコル | どう話すか | OAuth / OpenID4VCI / OpenID4VP のメタデータ、エンドポイント、アルゴリズム、アプリ鍵 |
| ③ 外部の基盤 | 何につながるか | 国の IdP(CieID)、国のデータ連携基盤(PDND)、端末メーカーの仕組み |
①は全員ほぼ同じ形で、②と③が主体ごとに違います。
1. 全員に共通する設定
Entity Configuration
Federation に参加する主体は、/.well-known/openid-federation に自分の Entity Configuration を公開します。自己署名の JWT です。
| 公開する主体 | 公開しない主体 |
|---|---|
| Trust Anchor、Intermediate、Wallet Provider、Credential Issuer、Relying Party | Wallet Instance、Authentic Source |
中身の骨格は共通です。
{
"iss": "https://issuer.example.org",
"sub": "https://issuer.example.org",
"iat": 1772444318,
"exp": 1772530718,
"jwks": { "keys": [ { "kid": "...", "kty": "EC", "crv": "P-256", "x": "...", "y": "..." } ] },
"authority_hints": [ "https://intermediate.example.it" ],
"trust_marks": [ { "trust_mark_type": "...", "trust_mark": "eyJ..." } ],
"metadata": {
"federation_entity": { "organization_name": "...", "homepage_uri": "...", "policy_uri": "...", "logo_uri": "...svg", "contacts": [ "...@pec.example.it" ] },
"(主体ごとのメタデータ)": { }
}
}
jwksは Federation 鍵。Entity Configuration の署名を検証するための鍵ですmetadataの下に、主体の種類ごとのメタデータを並べます。federation_entityは全員が持ち、残りが主体ごとに違いますlogo_uriは SVG、contactsには PEC(イタリアの認定電子メール)のアドレスを入れます
鍵は 2 種類
仕様は、少なくとも 2 種類の鍵ペアを求めています。
| 鍵 | 使い道 | 置き場所 |
|---|---|---|
| Federation 鍵 | Entity Configuration の署名と、アプリ鍵の証明 | Entity Configuration の jwks。ローテーションのため 2 本以上持つことが推奨 |
| アプリ鍵 | 発行、提示などのプロトコル処理 | 各メタデータの jwks |
アプリ鍵は、Federation 鍵で自分で証明書を発行して証明します。ここで X.509 が出てきます。
X.509 との二重構造
IT-Wallet は、OpenID Federation と X.509 の PKI を重ねて使 います。Trust Anchor が Federation の根であり、X.509 のルート CA でもあります。
┌───────────────────────────────────────────┐
│ Trust Anchor │
│ ルート CA の証明書(5 年以内) │
└─────────────────────┬─────────────────────┘
│ 登録のときに発行
▼
┌───────────────────────────────────────────┐
│ 各主体の Federation 鍵の証明書(2 年以内) │
│ CA:TRUE。Leaf は pathlen 0 │
│ Name Constraints で自分のドメインに限定 │
└─────────────────────┬─────────────────────┘
│ 自分で発行(自己発行)
▼
┌───────────────────────────────────────────┐
│ アプリ鍵の証明書(1 年以内が推奨) │
│ クレデンシャル、WIA、Status List などの │
│ 署名の x5c に入る │
└───────────────────────────────────────────┘
各主体は「自分についてだけ証明書を出せる、小さな CA」になります。 Name Constraints があるので、他人の証明書は出せません。
こうしておくと、Trust Chain を辿れない検証者でも、x5c の証明書チェーンを Trust Anchor のルートまで辿れば検証できます。Federation の仕組みと、EU の枠組み が前提にする X.509 の両方に応えられる形です。
有効期間が 24 時間を超える証明書を出すなら、失効リスト(CRL)を公開する必要があります。
登録は 4 段階
主体 上位(Trust Anchor / Intermediate)
│ 先に自分の Entity Configuration を公開しておく
│
│ ① 申請: Entity Identifier、Federation 鍵、CSR ──────▶ │
│ メタデータを確認し、
│ Metadata Policy を当てる
│ ◀────────── ② Federation 鍵の証明書、登録 ID ──────── │
│ │
│ ③ /fetch で自分の Subordinate Statement を取得 ─────▶ │
│ ◀────────── Subordinate Statement(x5c 付き)────── │
│
│ ④ 自分の Entity Configuration に
│ authority_hints と、受け取った Trust Mark を載せる
Trust Mark の種類は https://<Federation Authority のドメイン>/trust_marks/<目的>/<主体の種類> の形で、federation-entity の目的のものは必須です。
**失効は「Subordinate Statement が出なくなること」**で表されます。IT-Wallet を読む で見たとおりです。
2. 立ち上げる順番
設定には依存関係があります。上から順に立てないと、下が動きません。
┌─ Trust Anchor ─────────────────────────────────────────────┐
│ ルート CA、Federation 鍵を仕様外の経路で配布、Catalog、レジストリ │
└──────────────────────────────┬─────────────────────────────┘
▼
┌─ Intermediate(必要なら)──────────────────────────────────────┐
└──────────────────────────────┬─────────────────────────────┘
▼
┌─ 各事業者の登録 ──────────────────────────────────────────────┐
│ Wallet Provider / Credential Issuer / Relying Party │
│ Credential Issuer はさらに: CieID へ RP 登録、PDND の利用者登録 │
│ Authentic Source: レジストリ登録、PDND の e-service を公開 │
└──────────────────────────────┬─────────────────────────────┘
▼
┌─ Wallet の有効化 ─────────────────────────────────────────────┐
│ 端末の登録 → KA → WIA │
└──────────────────────────────┬─────────────────────────────┘
▼
┌─ PID の発行 ──────────────────────────────────────────────────┐
│ WIA でクライアント認証 → CieID(CIE L3)→ PDND で ANPR から属性 │
└──────────────────────────────┬─────────────────────────────┘
▼
┌─ (Q)EAA の発行 ───────────────────────────────────────────────┐
│ 利用者認証として PID を提示する │
└──────────────────────────────┬ ─────────────────────────────┘
▼
┌─ RP への提示 ─────────────────────────────────────────────────┐
└────────────────────────────────────────────────────────────┘
とくに (Q)EAA は PID を前提にしているので、PID Provider が立たないと (Q)EAA の発行は試せません。
3. 主体ごとの設定
3.1 Trust Anchor / Intermediate
| 層 | 設定 |
|---|---|
| ① | federation_entity だけを持つ。Trust Anchor は、Trust Mark を発行してよい主体の一覧(trust_mark_issuers)も載せる |
| ② | Federation の各エンドポイント(fetch、list、resolve、Trust Mark の状態確認と一覧、過去の鍵、下位のイベント) |
| 鍵 | Federation 鍵。Trust Anchor はこれを 仕様外の経路(検証済みの Web ページやトラストリストなど)で配る |
| その他 | Trust Anchor は .well-known/it-wallet-registry にレジストリの入口を公開し、Digital Credentials Catalog も公開する |
"federation_entity": {
"federation_fetch_endpoint": "https://trust-anchor.example.it/fetch",
"federation_resolve_endpoint": "https://trust-anchor.example.it/resolve",
"federation_list_endpoint": "https://trust-anchor.example.it/list",
"federation_trust_mark_status_endpoint": "https://trust-anchor.example.it/trust_mark_status",
"federation_trust_mark_list_endpoint": "https://trust-anchor.example.it/trust_mark_listing"
}
下位に出す Subordinate Statement には、下位の Federation 鍵(jwks)と、constraints、必要なら metadata_policy を入れます。上位の Metadata Policy に合わないメタデータは、Trust Chain の評価で落ちます。
3.2 Wallet Provider
| 層 | 設定 |
|---|---|
| ① | federation_entity と openid_wallet_provider |
| ② | Nonce、Wallet Instance の登録・取得・失効、KA の発行、WIA の発行 |
| 鍵 | WIA と KA に署名する鍵。署名には x5c を付ける |
| ③ | 端末メーカーの仕組み(Android は Play Integrity、iOS は App Attest を、OS が提供する最も安全な方式として使う) |
"openid_wallet_provider": {
"logo_uri": "https://wallet-provider.example.org/compact-logo.svg",
"jwks": { "keys": [ { "kid": "...", "kty": "EC", "crv": "P-256", "x": "...", "y": "..." } ] },
"wallet_metadata": {
"wallet_name": "Wallet X",
"authorization_endpoint": "https://wallet-solution.example.org/authorization",
"credential_offer_endpoint": "https://wallet-solution.example.org/credential_offer",
"response_types_supported": [ "vp_token" ],
"vp_formats_supported": { "dc+sd-jwt": { "sd-jwt_alg_values": [ "ES256", "ES384" ] } },
"request_object_signing_alg_values_supported": [ "ES256" ],
"client_id_prefixes_supported": [ "openid_federation", "x509_hash" ]
}
}
jwksはこのメタデータ専用の鍵で、WIA などの署名に使います。Entity Configuration のjwks(Federation 鍵)とは別ですwallet_metadataはウォレット自身の設 定です。ウォレットは Federation に参加しないので、Wallet Provider が代わりに公開します(次の 3.3)
発行する WIA の中身はこうです。
// ヘッダ
{ "typ": "oauth-client-attestation+jwt", "alg": "ES256", "kid": "...", "x5c": [ "...", "..." ] }
// ペイロード
{
"iss": "https://wallet-provider.example.org",
"sub": "<cnf.jwk の JWK サムプリント>",
"cnf": { "jwk": { "kty": "EC", "crv": "P-256", "x": "...", "y": "..." } },
"wallet_name": "ExampleOrg",
"wallet_link": "https://example.org/wallets/ExampleOrg/info",
"iat": 1772444318,
"exp": 1772447918
}
subはcnfの公開鍵の JWK サムプリント。ウォレットのclient_idと同じ値になる(5 章)- 有効期間は 24 時間未満
- 利用者の情報は入れない
- 見せる相手は PID Provider と Attestation Provider だけで、RP には見せない
エンドポイントごとの中身、検証と保存、失効、Apple / Google 側の設定は「4. Wallet の文脈を動かす設定」で扱います。
3.3 Wallet
Wallet Instance は Federation に参加せず、自分のメタデータをオンラインで公開することもしません。設定の多くは、アプリに組み込むか、Wallet Provider が代わりに公開します。
| 何を | どこに |
|---|---|
| Trust Anchor の公開鍵 | アプリが持つ。仕様外の経路で入手する(どう組み込むかは仕様に書かれていない) |
x509_hash の RP を検証するためのルート証明書 | アプリが持つ。「事前に設定したルート証明書」まで辿れることが求められる |
| ウォレットのメタデータ | Wallet Provider の wallet_metadata、または提示のときに RP の request_uri へ送る |
| 呼び出し 口 | openid4vp:// と haip-vp:// の両方のカスタムスキームに対応する。authorization_endpoint には Universal Link を使うのが望ましい |
| 鍵 | 端末内。ハードウェア鍵、WIA 用の使い捨て鍵、クレデンシャル用の鍵 |
ウォレットのメタデータで大事なのは 2 つです。
| パラメータ | 意味 |
|---|---|
vp_formats_supported | 必須。dc+sd-jwt と mso_mdoc の両方を含める |
client_id_prefixes_supported | 推奨。受け付ける RP の識別方法。openid_federation と x509_hash |
Issuer は、Trust Anchor の .well-known/it-wallet-registry → Digital Credentials Catalog → Issuer の Entity Configuration の順に辿って見つけます。
3.4 Credential Issuer
いちばん設定が多い主体です。メタデータを 3 種類以上持ちます。
| 層 | 設定 |
|---|---|
| ① | federation_entity、oauth_authorization_server、openid_credential_issuer。(Q)EAA の発行でウォレットに PID を提示させるなら openid_credential_verifier も |
| ② | PAR、認可、トークン、クレデンシャル、Nonce、通知の各エンドポイント。Status List |
| 鍵 | アクセストークンの署名鍵、クレデンシャルの署名鍵(x5c 付き)、Status List Token の署名鍵(x5c 付き) |
| ③ | CieID に RP として登録する(PID と IT-Wallet ID の発行のため)。PDND に利用者として登録する(Authentic Source から属性を取るため) |
認可サーバーのメタデータ(oauth_authorization_server)で、ウォレットとの付き合い方を決めます。
"oauth_authorization_server": {
"issuer": "https://eaa-provider.example.org",
"pushed_authorization_request_endpoint": "https://eaa-provider.example.org/as/par",
"authorization_endpoint": "https://eaa-provider.example.org/authorize",
"token_endpoint": "https://eaa-provider.example.org/token",
"client_registration_types_supported": [ "automatic" ],
"code_challenge_methods_supported": [ "S256" ],
"acr_values_supported": [ "https://trust-anchor.example.it/loa/high" ],
"grant_types_supported": [ "authorization_code" ],
"token_endpoint_auth_methods_supported": [ "attest_jwt_client_auth" ],
"client_attestation_signing_alg_values_supported": [ "ES256" ],
"client_attestation_pop_signing_alg_values_supported": [ "ES256" ],
"require_signed_request_object": true,
"dpop_signing_alg_values_supported": [ "ES256" ],
"jwks": { "keys": [ { "kid": "...", "kty": "EC", "crv": "P-256", "x": "...", "y": "..." } ] }
}
| パラメータ | 仕様の要求 |
|---|---|
pushed_authorization_request_endpoint | ウォレットは必ず PAR で送る |
token_endpoint_auth_methods_supported | attest_jwt_client_auth に対応する(WIA によるクライアント認証) |
client_attestation_*_signing_alg_values_supported | attest_jwt_client_auth を載せるなら必須。none と MAC は不可 |
code_challenge_methods_supported | S256 に対応する(PKCE) |
require_signed_request_object | true。認可リクエストは署名付き |
client_registration_types_supported | automatic に対応する |
クレデンシャル発行のメタデータ(openid_credential_issuer)で、何を出すかを決めます。
"openid_credential_issuer": {
"credential_issuer": "https://eaa-provider.example.org",
"credential_endpoint": "https://eaa-provider.example.org/credential",
"nonce_endpoint": "https://eaa-provider.example.org/nonce-endpoint",
"notification_endpoint": "https://eaa-provider.example.org/notification",
"trust_frameworks_supported": [ "it_cie", "it_wallet", "eudi_wallet" ],
"status_list_aggregation_endpoint": "https://eaa-provider.example.org/statuslists/aggregation",
"credential_configurations_supported": {
"dc_sd_jwt_EuropeanDisabilityCard": {
"format": "dc+sd-jwt",
"scope": "EuropeanDisabilityCard",
"vct": "urn:eudi:EuropeanDisabilityCard:it:1",
"cryptographic_binding_methods_supported": [ "jwk" ],
"credential_signing_alg_values_supported": [ "ES256" ],
"proof_types_supported": {
"jwt": {
"proof_signing_alg_values_supported": [ "ES256" ],
"key_attestations_required": {
"key_storage": [ "iso_18045_enhanced-basic" ],
"user_authentication": [ "iso_18045_enhanced-basic" ]
}
}
},
"schema_id": "EuropeanDisabilityCard+dc+sd-jwt+urn:eudi:EuropeanDisabilityCard:it:1",
"authentic_sources": [ { "entity_id": "https://authentic-source.example.com", "dataset_id": "12345" } ]
}
}
}
| パラメータ | 意味 |
|---|---|
scope | Digital Credentials Catalog の種類と一致させる |
key_attestations_required | クレデンシャル用の鍵に KA を求める。求める安全性の水準も書く |
schema_id | Schema Registry に登録したスキーマ |
authentic_sources | 属性をどの Authentic Source のどのデータから取るか |
trust_frameworks_supported | 発行のときにどの枠組みで本人を確認するか |
Wallet の設定(3.2 の wallet_metadata)と、Issuer の設定(このメタデータ)が、ここで初めて噛み合います。 ウォレットが対応するアルゴリズムや形式と、Issuer が要求するものが重ならないと、発行は失敗します。
3.5 Relying Party
| 層 | 設定 |
|---|---|
| ① | federation_entity と openid_credential_verifier |
| ② | request_uris(Request Object を渡す口)、response_uris(応答を受ける口) |
| 鍵 | Request Object の署名鍵。応答の暗号化鍵 |
| 証明書 | RP Backend が信頼基盤から X.509 証明書を得て、RP Instance にも証明書を渡す(推奨)。スマホアプリ型の RP Instance は、アクセス証明書を受け取る |
"openid_credential_verifier": {
"application_type": "web",
"client_id": "https://relying-party.example.org",
"client_name": "Organization Name",
"logo_uri": "https://relying-party.example.org/public/compact-logo.svg",
"request_uris": [ "https://relying-party.example.org/request_uri" ],
"response_uris": [ "https://relying-party.example.org/response_uri" ],
"encrypted_response_enc_values_supported": [ "A256GCM" ],
"vp_formats_supported": {
"dc+sd-jwt": { "sd-jwt_alg_values": [ "ES256" ], "kb-jwt_alg_values": [ "ES256" ] },
"mso_mdoc": { "issuerauth_alg_values": [ -9 ], "deviceauth_alg_values": [ -9 ] }
},
"jwks": { "keys": [ { "kid": "...", "kty": "EC", "crv": "P-256", "x": "...", "y": "..." } ] }
}
request_uriとresponse_uriは、Trust Chain で確かめられたメタデータに載っている値でなければならない- 応答は
direct_post.jwtで暗号化して受け取る - 何を要求してよいかは、上位の Metadata Policy と Trust Mark で決まる。自分のメタデータだけでは決まらない
3.6 Authentic Source
Federation には参加せず、データの登録という別の経路で参加します。
| 設定 | 内容 |
|---|---|
| レジストリ登録 | 組織情報、提供する属性(Claims Registry の識別子)、目的、API の情報 |
| PDND | 公的機関は必須。属性を渡す e-service(Get Attribute Claims)を提供する |
| Signal Hub | PDND を使うなら必須。属性の変更や無効化を Issuer に知らせる唯一の経路 |
民間の Authentic Source は PDND の代わりに OpenAPI の仕様書とテスト環境を出します。
4. Wallet の文脈を動かす設定
ここからは、IT-Wallet の生態系 で見た「Wallet の文脈」を、設定の単位まで開きます。
┌──────────┐
PIN / 生体で ┌─│ 利用者 │───────────────────────────────────┐ Web ポータルにログイン
ロック解除 │ └──────────┘ │(2 要素以上)
▼ ▼
┌─ 利用者の端末 ───────────────────────────────┐ ┌─ Wallet Provider ──────┐
│ Wallet Instance(アプリ) │ ① 登録 │ ・Nonce │
│ 持っているもの: │───────────▶ │ ・端末の登録 │
│ ・ハードウェア鍵(登録用) │ ② KA 要求 │ ・KA / WIA の発行 │
│ ・クレデンシャル用の鍵 │───────────▶ │ ・WIA の Status List │
│ ・KA / WIA │ ③ WIA 要求 │ ・利用者アカウント │
│ │ │ │───────────▶ │ (Web ポータル) │
│ 鍵の生成と署名 証明を頼む │◀─────────── └────────────────────────┘
│ ▼ ▼ │ KA / WIA ┊ 認証に使うかは
│ ┌──────────────────┐ ┌─────────────────────┐ │ ┊ Wallet Provider
│ │ Keystore │ │ OS の証明機能 │ │ ┊ の選択
│ │ Secure Enclave / │ │ Key Attestation API │ │ ▼
│ │ StrongBox / TEE │ │ Device Integrity │ │ ┌──────────────┐
│ └──────────────────┘ │ Service │ │ │ 国の IdP │
│ └─────────────────────┘ │ │(SPID / CIE)│
│ ↑ 端末メーカー製。 │ └──────────────┘
│ Federation の外 │
└──────────────────────────────────────────────┘
KA と WIA は、VC の文脈でウォレットが自分の正当性を示すのに使う
先に、前提を 2 つ押さえておきます。
Wallet Provider と Wallet Solution は 1 対 1 です。 Wallet Provider の Entity Configuration の iss / sub は「Wallet Solution の公開 URL」で、wallet_metadata も 1 組しか書けません。その下に、利用者の数だけ Wallet Instance がぶら下がります。1 つの組織が複数の Wallet Solution を持てるかは、仕様に書かれていません(WIA の要求には wallet_solution_id がありますが、メタデータの持ち方は定められていません)。
エンドポイントの形は、ほとんど Wallet Provider に任されています。 仕様が形を決めているのは Federation のエンドポイントだけで、それ以外は「実装の詳細は Wallet Provider の裁量」です。以下のパスは仕様の例です。
4.7 と 4.8 は、Apple と Google の公式ドキュメントに基づく設定です。IT-Wallet の仕様は「OS が提供する最も安全な方式を使う」としか書いていないので、実際に動かすにはこちらの設定が要ります。2026 年 9 月時点の情報です。