規制の背景: eIDAS 1.0 から eIDAS 2.0 へ

規制 eIDAS 1.0 (EU 910/2014) は、欧州連合におけるデジタル ID システムの相互運用性の基礎を築きました。 しかし、加盟国による自発的な採用、モバイルの世界にあまり適していない SAML 2.0 フロー、デジタル ウォレットの欠如など、明らかな限界が示されました。 国民向けに標準化されています。 10年後、規制は EU 2024/1183 — 正式には eIDAS 2.0 として知られています — が発効しました の 2024 年 5 月 20 日 ゲームのルールを書き換えること。

開発者にとって最も関連性の高いニュースは次のとおりです。すべての加盟国に、 欧州連合デジタル ID ウォレット (EUDI ウォレット) 2026 年までに、 電子属性証明書 (EAA)、の概念 適格電子属性証明書 (QEAA)、 そして規制セクターの依拠当事者(RP)は2027年までにウォレットを受け入れる義務がある。

eIDAS 2.0 規制スケジュール

  • 2024 年 5 月 20 日 – EU規則2024/1183の発効
  • 2025年 – 技術的実施法(ARF、プロトコル)の発行
  • 2026年 – すべての EU 加盟国は自国民に EUDI ウォレットを提供しなければなりません
  • 2027年 – 規制セクターの依拠当事者は EUDI ウォレットを受け入れることが義務付けられています

EUDI ウォレットのアーキテクチャ: 基本コンポーネント

EUDI ウォレットのリファレンス アーキテクチャは次のように定義されています。アーキテクチャおよび参照フレームワーク (ARF)、技術文書 欧州委員会によって維持されています。システムは 4 つの主要な層で構成されます。

1. 発行者層 — 資格情報を発行する者

Gli 発行者 検証可能な証明書を発行する権限を与えられたエンティティです。 2 つの主要なカテゴリがあります。

  • PIDプロバイダー: 彼らは、国家によって発行される基本的な身元証明書である個人識別データ (PID) を発行します (デジタル身分証明書に相当)。
  • 認証プロバイダー: EAA (電子属性証明書) を発行します。たとえば、運転免許証、教育資格、健康カード、専門資格などです。

発行の標準プロトコルは次のとおりです。 OpenID4VCI (検証可能な資格情報発行用の OpenID)、専用エンドポイントを使用して OAuth 2.0 フローを拡張します。 資格情報を要求および発行するため。

// Esempio: Token Request per OpenID4VCI
// POST /token

{
  "grant_type": "urn:ietf:params:oauth:grant-type:pre-authorized_code",
  "pre-authorized_code": "SplxlOBeZQQYbYS6WxSbIA",
  "user_pin": "493536"
}

// Risposta con Access Token
{
  "access_token": "eyJraWQiOiJrZXktMSJ9...",
  "token_type": "bearer",
  "expires_in": 86400,
  "c_nonce": "tZignsnFbp",
  "c_nonce_expires_in": 86400
}

// Credential Request
// POST /credential
// Authorization: Bearer eyJraWQiOiJrZXktMSJ9...

{
  "format": "vc+sd-jwt",
  "credential_definition": {
    "type": ["VerifiableCredential", "PersonIdentificationData"]
  },
  "proof": {
    "proof_type": "jwt",
    "jwt": "eyJraWQiOiJrZXktMiIsInR5cCI6Im9wZW5pZDR2Y2ktcHJvb2Yrand..."
  }
}

2. ウォレット層 — 市民の財布

Il EUDIウォレット これは、国民が自分の資格情報を受信、保存、提示するために使用するアプリケーション (モバイルまたは Web) です。 実施法によって定義されたセキュリティ標準 (EUCC - 共通基準のための EU サイバーセキュリティ認証スキーム) に従って認証される必要があります。 主な機能は次のとおりです。

  • 安全な暗号キー管理 (ハードウェアが利用可能な場合)
  • SD-JWT VC (選択的開示 JWT 検証可能な資格情報) のサポート
  • モバイル運転免許証プロファイルの ISO 18013-5 (mdoc) のサポート
  • NFC/BLEによる近接プレゼンテーション(物理制御用)
  • ブラウザ経由のリモート プレゼンテーション (HTTPS リダイレクト)

3. 検証者/証明書利用者レイヤー — 資格情報を受け取る人

I 依存当事者 (RP) — VC エコシステムでは Verifier とも呼ばれます — 認証を必要とするサービスです あるいは国民の属性の確認。提出用のプロトコルは、 OpenID4VP (検証可能なプレゼンテーション用の OpenID)、 と組み合わせてよく使われます SIOPv2 (自己発行 OpenID プロバイダー v2) 自己主権フローの場合。

4. 信頼インフラストラクチャ — 信頼の連鎖

EUDI ウォレットは、 欧州公開鍵インフラストラクチャ (PKI)。 委員会によって調整される。各発行者を登録する必要があります でEUDIW 信頼できる発行者レジストリ、検証者は信頼当事者として登録する必要があります。資格情報の検証が行われる 加盟国の国家 PKI に固定された X.509 v3 証明書を介した発行者のデジタル署名の検証を通じて。

SD-JWT: 選択的開示とプライバシー

eIDAS 2.0 の最も関連性の高い技術的側面の 1 つは、 SD-JWT (選択的開示 JSON Web トークン)、定義 対応する IETF RFC に記載されています。基本的な考え方は、所有者が特定のトランザクションに必要な属性のみを公開できるようにすることです。 身分証明書全体を公開することなく。

データ最小化の原則

SD-JWT を使用すると、国民は正確な生年月日を明らかにすることなく、自分が成人であることを証明できます。または、特定の自治体に居住していることを証明する必要はありません。 完全なアドレスを表示します。これが GDPR 原則の核心です データの最小化 デジタルアイデンティティに適用されます。

SD-JWT は 3 つの部分で構成されます。

// Struttura SD-JWT

// 1. JWT Header + Payload (con disclosures hashate)
{
  "iss": "https://issuer.example.gov.it",
  "sub": "user_12345",
  "iat": 1710000000,
  "exp": 1741536000,
  "_sd_alg": "sha-256",
  "_sd": [
    "YIk1uXcv7d9yT8rX4mZ1aA",   // hash di "given_name": "Mario"
    "kp3uX9vZ2d8rT7yX5mZ3bB",   // hash di "family_name": "Rossi"
    "Xp4uX8vZ3d9rT6yX6mZ4cC",   // hash di "birthdate": "1990-01-15"
    "Zp5uX7vZ4d0rT5yX7mZ5dD"    // hash di "age_over_18": true
  ]
}

// 2. Disclosure (payload completo, trasmesso separatamente)
// Ogni disclosure = base64url( salt || claim_name || claim_value )
// Esempio decoded:
["ynMvKGiQegTHCXkHkEL4aA", "given_name", "Mario"]
["qRpTaSvVlGnb9uOtCiKqGg", "age_over_18", true]

// 3. Presentazione selettiva al Verifier
// Il holder invia solo le disclosures che vuole rivelare
// In questo esempio: solo age_over_18, non given_name

eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwcz...~qRpTaSvVlGnb9uOtCiKqGg~

証明書利用者 EUDI ウォレットの実装

EUDI ウォレット ID を受け入れる必要があるデジタル サービスを開発している場合は、 検証者/依拠当事者。 主な手順は次のとおりです。

ステップ 1: 証明書利用者としての登録

各 RP は国内仲介者登録簿に登録し、署名に使用される X.509 証明書を取得する必要があります。 認可リクエスト ウォレットに送信されます。イタリアでは、レジストリは次のように管理されています。 AgID.

ステップ 2: 認可リクエストを作成する (OpenID4VP)

// Authorization Request OpenID4VP
// Il RP genera un signed JWT con i parametri di presentazione

// Header JWT del Request Object
{
  "alg": "ES256",
  "kid": "rp-key-2025",
  "typ": "oauth-authz-req+jwt"
}

// Payload JWT del Request Object
{
  "client_id": "https://my-service.comune.it/eudi-rp",
  "client_id_scheme": "x509_san_uri",
  "response_type": "vp_token",
  "response_mode": "direct_post",
  "response_uri": "https://my-service.comune.it/eudi-rp/callback",
  "nonce": "n-0S6_WzA2Mj",
  "state": "af0ifjsldkj",
  "presentation_definition": {
    "id": "pid-age-verification",
    "input_descriptors": [
      {
        "id": "pid_vc",
        "format": {
          "vc+sd-jwt": {
            "alg": ["ES256", "ES384"]
          }
        },
        "constraints": {
          "fields": [
            {
              "path": ["$.vct"],
              "filter": {
                "type": "string",
                "const": "PersonIdentificationData"
              }
            },
            {
              "path": ["$.age_over_18"],
              "intent_to_retain": false
            }
          ]
        }
      }
    ]
  }
}

ステップ 3: VP トークンの検証

ウォレットが応答すると、 vp_token、依拠当事者は次のチェックを実行する必要があります。

// Pseudo-codice Python per verifica VP Token

import jwt
import hashlib
import base64

def verify_vp_token(vp_token: str, expected_nonce: str) -> dict:
    # 1. Splitta SD-JWT in parti (~ come separatore)
    parts = vp_token.split("~")
    sd_jwt = parts[0]
    disclosures = parts[1:-1]  # ultime parte potrebbe essere KB-JWT
    key_binding_jwt = parts[-1] if len(parts) > 1 else None

    # 2. Decodifica e verifica il JWT principale
    header = jwt.get_unverified_header(sd_jwt)
    # Recupera il certificato dell'issuer dalla PKI europea
    issuer_cert = fetch_issuer_cert(header.get("x5c"))
    payload = jwt.decode(sd_jwt, issuer_cert, algorithms=["ES256"])

    # 3. Verifica nonce nel Key Binding JWT
    if key_binding_jwt:
        kb_payload = jwt.decode(key_binding_jwt, options={"verify_signature": False})
        assert kb_payload["nonce"] == expected_nonce, "Nonce mismatch"
        assert kb_payload["aud"] == "https://my-service.comune.it/eudi-rp"

    # 4. Risolvi le disclosures
    disclosed_claims = {}
    for disclosure in disclosures:
        # Verifica hash
        disclosure_hash = base64.urlsafe_b64encode(
            hashlib.sha256(disclosure.encode()).digest()
        ).rstrip(b"=").decode()
        if disclosure_hash in payload.get("_sd", []):
            decoded = json.loads(base64.urlsafe_b64decode(disclosure + "=="))
            # formato: [salt, claim_name, claim_value]
            disclosed_claims[decoded[1]] = decoded[2]

    return disclosed_claims

IT ウォレット イタリアーノ: 最先端

イタリアは独自の方法で EUDI ウォレット エコシステムにアプローチしています ITウォレット、2024 年 7 月 3 日の立法令によって規定されています。 31 と開発 PNRR内で。システムを運営しているのは、 パゴパ S.p.A. また、既存の SPID および CIE (電子 ID カード) システムを統合します。

IT ウォレットは EUDI 準拠のウォレットに向けた移行ソリューションとして設計されており、2025 年の初めからパイロット段階が開始されています。 利用可能な最初の資格情報としてデジタル運転免許証、健康カード、障害者手帳を使用します。

IT ウォレットの認証情報 (パイロット フェーズ 2025)

  • mDL – モバイル運転免許証 (ISO 18013-5)
  • TS-CNS – 健康カード/国民サービスカード
  • 障害者手帳 – INPS認証
  • PID – 個人識別データ (CIE から取得)

SIOPv2 を使用した OpenID4VP: クロスデバイス フロー

一般的なシナリオは、 クロスデバイスフロー: ユーザーはデスクトップで Web サイトにアクセスし、スマートフォンを使用してウォレットで認証します。 一般的なフローでは、最初の通信チャネルとして QR コードを使用します。

// Flusso cross-device EUDI Wallet

// 1. Il RP genera il Request Object e lo rende disponibile
GET /eudi/request.jwt HTTP/1.1
// Risposta: signed JWT con presentation_definition

// 2. Il RP mostra un QR code che contiene:
eudi-openid4vp://?
  client_id=https%3A%2F%2Fmy-service.comune.it%2Feudi-rp&
  request_uri=https%3A%2F%2Fmy-service.comune.it%2Feudi-rp%2Frequest.jwt&
  state=af0ifjsldkj

// 3. Il wallet dell'utente scansiona il QR:
//    - Risolve il request_uri
//    - Valida la firma del Request Object
//    - Mostra all'utente quale attributo viene richiesto
//    - Chiede il consenso

// 4. Il wallet invia la risposta via direct_post al response_uri:
POST /eudi-rp/callback HTTP/1.1
Content-Type: application/x-www-form-urlencoded

vp_token=eyJhbGciOiJFUzI1NiJ9...&
state=af0ifjsldkj

// 5. Il RP verifica la VP Token
// 6. Il RP redirige il browser desktop tramite session polling o SSE

SPID および CIE との相互運用性

イタリアの開発者は、現在のシステムが新しい EUDI エコシステムとどのように共存するかを理解する必要があります。

システム プロトコル 身元 有効期限 注意事項
SPID SAML 2.0 / OIDC フェデレーション (プライベート IdP) 2026 年以降まで運用可能 徐々に EUDI に収束していく
CIE (電子 ID カード) SAML 2.0 / OIDC / NFC 州 (内務省) 長期運用可能 EUDI ウォレットの PID ソース
IT ウォレット (PagoPA) OpenID4VCI / OpenID4VP ナショナルウォレット 2025+ (パイロット) EUDI ウォレットへの移行
EUDIウォレット OpenID4VCI / OpenID4VP / SD-JWT EU(国境を越えた) 2026年から義務化 決定的なヨーロッパ規格

セキュリティと暗号化に関する考慮事項

EUDI ウォレットの実装では、いくつかのセキュリティ面に注意する必要があります。

キーバインド

各認証情報は、と呼ばれるメカニズムを介してウォレット (したがって国民の物理デバイス) に暗号的にリンクされます。 キーバインド。所有者の秘密キーはデバイスの安全な要素から決して外に出してはなりません。 の キーバインド JWT (KB-JWT) SD-JWTに登録されている公開鍵に対応する秘密鍵を発表者が所有していることを証明します。

リプレイ攻撃の防止

フィールド nonce 認可リクエストでは、RP によってランダムに生成され、ウォレットによって署名された KB-JWT に含まれている必要があります。 RP は、ノンスが最初に生成されたものと一致することを検証し、リプレイ攻撃を防ぎます。

警告: 一時的な有効性

検証可能な認証情報には有効期限があります (exp)。サービスは、資格情報の有効期限が切れていないことを常に検証する必要があります。 そして、失効ポリシーを検討してください(ステータスリストまたは実施法で定義されているOCSPのようなメカニズムを介して)。

証明書の検証

発行者の証明書は、ヨーロッパのトラストアンカーまでの PKI チェーンに沿って検証される必要があります。常に更新されたバージョンを使用してください の 信頼できるリスト 欧州連合 (EU 委員会から API 経由で利用可能)。

開発者ツールとライブラリ

EUDI ウォレットを中心としたオープンソース エコシステムは急速に成長しています。最も重要な参考資料は次のとおりです。

# Librerie ufficiali EU (reference implementations)

# Python - EUDI Wallet Issuer SDK
pip install eudi-srv-pid-issuer

# Python - SD-JWT Reference Implementation
pip install sd-jwt

# Java - EUDI Wallet Core Library
# gradle dependency:
# implementation("eu.europa.ec.eudi:eudi-lib-jvm-sdjwt-kt:latest")

# TypeScript/JavaScript
npm install @sd-jwt/sd-jwt-vc @sd-jwt/decode
npm install openid4vc  # OID4VCI + OID4VP client

# --- Esempio uso sd-jwt in TypeScript ---
import { SDJwtVcInstance } from "@sd-jwt/sd-jwt-vc";
import { digest, generateSalt } from "@sd-jwt/crypto-nodejs";

const sdjwt = new SDJwtVcInstance({
  signer: async (data: string) => sign(data, issuerPrivateKey),
  signAlg: "ES256",
  verifier: async (data: string, sig: string) => verify(data, sig, issuerPublicKey),
  hasher: digest,
  hashAlg: "sha-256",
  saltGenerator: generateSalt,
});

// Emetti una credenziale
const credential = await sdjwt.issue(
  {
    iss: "https://issuer.gov.it",
    iat: Math.floor(Date.now() / 1000),
    vct: "PersonIdentificationData",
    given_name: "Mario",
    family_name: "Rossi",
    age_over_18: true,
    birthdate: "1990-01-15",
  },
  // Indica quali claim sono selectively disclosable
  {
    _sd: ["given_name", "family_name", "birthdate", "age_over_18"],
  }
);

console.log(credential); // eyJhbGciOiJFUzI1NiJ9...~...

テスト環境とサンドボックス環境

本番環境に移行する前に、公式のサンドボックス環境を使用してください。

  • EU EUDI ウォレット参照アプリケーション: オープンソースの Android/iOS アプリとして GitHub (eu-digital-identity-wallet) で入手できます。 発行者デモ、検証者デモ、PID 発行者テストが含まれます。
  • イタリア IT ウォレット サンドボックス: PagoPA は、Relying Party (連絡先) などの統合のためのテスト環境を提供します。 アクセスするには、developers.italia.it コミュニティ)。
  • EUDIW適合性テストツール: 実施法の遵守をテストするための EU 委員会のツール。

イタリアの開発者向けのロードマップ

イタリア国民にサービスを提供する行政機関または民間企業で働いている場合、具体的な行動は次のとおりです。 今後数か月以内に実施される予定:

EUDI ウォレット対応チェックリスト

  • 認証戦略を更新: OpenID4VP と SPID/CIE OIDC を今すぐ組み合わせてください
  • を勉強してください プレゼンテーションの定義 あなたのユースケースに合わせて (実際に必要な属性は何ですか?)
  • バックエンド アプリケーションに SD-JWT 検証を実装する
  • 利用可能な場合は、AgID レジスタにサービスを依拠当事者として登録します。
  • EUDI ウォレット リファレンス アプリ (GitHub 上の Android バージョン) とテストを統合します。
  • VC のコンテキストにおける GDPR とデータの最小化についてチームをトレーニングする
  • 実施法の監視: 技術仕様は 2026 年までに進化します

結論

eIDAS 2.0 と EUDI ウォレットは、ここ数十年間におけるヨーロッパのデジタル アイデンティティ環境の最も大きな変革を表しています。 開発者にとって、これは、SD-JWT、OpenID4VCI、OpenID4VP、SIOPv2、大陸規模の PKI など、まったく新しいテクノロジー エコシステムを採用することを意味します。

移行はすぐには行われません。SPID と CIE は今後何年も並行して運営されますが、今が準備を始める時期です。 早期に適応したサービスは真の競争上の優位性を持ち、EUDI ウォレットの大量導入が変化したときに準備が整います。 プライバシー、制御、国境を越えた相互運用性に関するユーザーの期待。

GovTechシリーズは続く

政府 ID のための OpenID Connect の実装について詳しくは、シリーズの次の記事をご覧ください。