Regulační kontext: Od eIDAS 1.0 k eIDAS 2.0

Nařízení eIDAS 1.0 (EU 910/2014) položila základy interoperability systémů digitální identity v Evropské unii, ukázaly se však zjevná omezení: dobrovolné přijetí členskými státy, toky SAML 2.0, které nejsou příliš vhodné pro mobilní svět, a absence digitální peněženky standardizované pro občany. O deset let později nařízení EU 2024/1183 — formálně známý jako eIDAS 2.0 — vstoupil v platnost a 20. května 2024 přepisování pravidel hry.

Mezi nejdůležitější novinky pro vývojáře patří: povinnost pro všechny členské státy vydat a European Union Digital Identity Wallet (EUDI Wallet) do roku 2026, zavedení Elektronická osvědčení o atributech (EAA), koncept Kvalifikovaná elektronická atestace atributů (QEAA), a povinnost spoléhajících se stran (RP) v regulovaných odvětvích přijmout peněženku do roku 2027.

Časová osa regulace eIDAS 2.0

  • 20. května 2024 – Vstup v platnost nařízení EU 2024/1183
  • 2025 – Zveřejňování technických prováděcích aktů (ARF, protokoly)
  • 2026 – Všechny státy EU musí svým občanům nabízet peněženky EUDI
  • 2027 – Spoléhající se strany v regulovaných odvětvích, které jsou povinny přijmout peněženku EUDI

Architektura peněženky EUDI: Základní komponenty

Referenční architektura peněženky EUDI je definovánaArchitektura a referenční rámec (ARF), technická dokumentace vedená Evropskou komisí. Systém se skládá ze čtyř hlavních vrstev:

1. Vrstva emitenta – kdo vydává pověření

The Emitenti jsou subjekty oprávněné vydávat ověřitelné certifikáty. Existují dvě hlavní kategorie:

  • Poskytovatelé PID: vydávají osobní identifikační údaje (PID), což je základní identifikační doklad vydávaný státem (ekvivalent digitálního dokladu totožnosti).
  • Poskytovatelé atestací: vydávají EAA (Electronic Attribute Atestations) — například řidičský průkaz, vzdělání, zdravotní průkaz, profesní kvalifikaci.

Standardní protokol pro vydání je OpenID4VCI (OpenID pro ověřitelné vydání pověření), která rozšiřuje tok OAuth 2.0 o vyhrazené koncové body pro vyžádání a vydání pověření.

// 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. Vrstva peněženky — Občanská peněženka

Il EUDI peněženka je to aplikace (mobilní nebo webová), kterou občan využívá k přijímání, ukládání a předkládání svých přihlašovacích údajů. Musí být certifikován podle bezpečnostních standardů definovaných prováděcími zákony (EUCC - EU Cybersecurity Certification Scheme for Common Criteria). Mezi klíčové vlastnosti patří:

  • Zabezpečená správa kryptografických klíčů (hardwarově zálohovaná, pokud je k dispozici)
  • Podpora pro SD-JWT VC (Selective Disclosure JWT Verifiable Credentials)
  • Podpora ISO 18013-5 (mdoc) pro profil mobilního řidičského průkazu
  • Prezentace přiblížení přes NFC/BLE (pro fyzické ovládání)
  • Vzdálená prezentace přes prohlížeč (HTTPS přesměrování)

3. Vrstva ověřovatele/spoléhající se strany – kdo obdrží pověření

I Spoléhající se strany (RP) — také nazývané Verifiers v ekosystému VC — jsou služby, které vyžadují ověření nebo ověření vlastností občana. Protokol k odevzdání je OpenID4VP (OpenID pro ověřitelné prezentace), často se používá v kombinaci s SIOPv2 (vlastně vydaný poskytovatel OpenID v2) pro sebesuverénní toky.

4. Infrastruktura důvěry — řetězec důvěry

Peněženka EUDI je založena na a Evropská infrastruktura veřejného klíče (PKI). koordinuje Komise. Každý emitent musí být registrován vRegistr důvěryhodných emitentů EUDIWa Ověřovatelé se musí zaregistrovat jako spoléhající strany. Dojde k ověření pověření ověřením digitálního podpisu Emitenta prostřednictvím certifikátů X.509 v3 ukotvených na národní PKI členského státu.

SD-JWT: Selektivní zveřejnění a soukromí

Jedním z nejdůležitějších technických aspektů eIDAS 2.0 je přijetí SD-JWT (Selective Disclosure JSON Web Tokens), definované v odpovídajícím RFC IETF. Základní myšlenkou je umožnit držiteli odhalit pouze atributy nezbytné pro danou transakci, bez vystavení celého dokladu totožnosti.

Princip minimalizace dat

S SD-JWT může občan prokázat, že je plnoletý, aniž by prozradil přesné datum narození. Nebo prokázat, že bydlíte v určité obci bez zobrazit celou adresu. To je srdce principu GDPR minimalizace dat aplikovat na digitální identitu.

SD-JWT se skládá ze tří částí:

// 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~

Implementujte peněženku EUDI spoléhající se strany

Pokud vyvíjíte digitální službu, která potřebuje přijmout identitu peněženky EUDI, musíte implementovat a Ověřovatel/spoléhající se strana. Hlavní kroky jsou:

Krok 1: Registrace jako spoléhající strana

Každý RP se musí zaregistrovat v národním registru zprostředkovatelů a získat certifikát X.509, který bude použit k podpisu Žádosti o autorizaci odesláno do peněženky. V Itálii registr spravuje AgID.

Krok 2: Vytvořte žádost o autorizaci (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
            }
          ]
        }
      }
    ]
  }
}

Krok 3: Ověření tokenu VP

Když peněženka odpoví a vp_tokenSpoléhající strana musí provést následující kontroly:

// 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 peněženka Italiano: Nejmodernější

Itálie přistupuje k ekosystému peněženky EUDI prostřednictvím svého IT peněženka, stanovené legislativním nařízením 07.03.2024 n. 31 a vyvinutý v rámci PNRR. Systém obsluhuje Společnost PagoPA S.p.A. a integruje již existující systémy SPID a CIE (Electronic Identity Card).

IT peněženka je navržena jako přechodné řešení k peněžence vyhovující EUDI a od začátku roku 2025 byla zahájena pilotní fáze s digitálním řidičským průkazem, zdravotní kartou a zdravotním průkazem jako prvními dostupnými doklady.

Pověření k peněžence IT (pilotní fáze 2025)

  • mDL – Mobilní řidičský průkaz (ISO 18013-5)
  • TS-CNS – Zdravotní karta / karta národních služeb
  • Osvědčení o invaliditě - Certifikace INPS
  • PID – Identifikační údaje osoby (odvozené z CIE)

OpenID4VP se SIOPv2: The Cross-Device Flow

Častým scénářem je tok napříč zařízeními: uživatel navštíví webovou stránku na počítači a použije smartphone k ověření peněženky. Typický tok používá jako počáteční komunikační kanál QR kód:

// 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

Interoperabilita s SPID a CIE

Italští vývojáři musí pochopit, jak současné systémy koexistují s novým ekosystémem EUDI:

Systém Protokol Identita Vypršení platnosti Poznámky
SPID SAML 2.0 / OIDC Federovaný (soukromý IdP) V provozu do roku 2026+ Postupně bude konvergovat do EUDI
CIE (elektronická identifikační karta) SAML 2.0 / OIDC / NFC stát (ministerstvo vnitra) Dlouhodobě funkční Zdroj PID pro peněženku EUDI
IT peněženka (PagoPA) OpenID4VCI / OpenID4VP Národní peněženka 2025+ (pilotní) Přechod na peněženku EUDI
EUDI peněženka OpenID4VCI / OpenID4VP / SD-JWT EU (přeshraniční) Povinné od roku 2026 Definitivní evropský standard

Bezpečnostní a kryptografické aspekty

Implementace peněženky EUDI vyžaduje pozornost k několika bezpečnostním aspektům:

Vazby na klíče

Každý přihlašovací údaj je kryptograficky propojen s peněženkou (a tedy s fyzickým zařízením občana) prostřednictvím mechanismu tzv. Vazby na klíče. Soukromý klíč držitele nesmí nikdy opustit zabezpečený prvek zařízení. The Klíčová vazba JWT (KB-JWT) prokáže, že přednášející vlastní soukromý klíč odpovídající veřejnému klíči registrovanému v SD-JWT.

Prevence proti opakovanému útoku

Pole nonce v Žádosti o autorizaci je náhodně vygenerován RP a musí být obsažen v KB-JWT podepsaném peněženkou. RP ověřuje, že se nonce shoduje s původně vygenerovaným, čímž zabraňuje opakovaným útokům.

Upozornění: Dočasná platnost

Ověřitelné přihlašovací údaje mají datum vypršení platnosti (exp). Služby musí vždy ověřit, zda nevypršela platnost pověření, a zvážit zásady odvolání (prostřednictvím seznamu stavů nebo mechanismů podobných OCSP definovaným v prováděcích aktech).

Ověření certifikátu

Vydavatelské certifikáty musí být ověřeny podél řetězce PKI až po evropské důvěryhodné kotvy. Vždy používejte aktualizovanou verzi z Seznam důvěryhodných Evropská unie (dostupné prostřednictvím API od Komise EU).

Vývojářské nástroje a knihovny

Ekosystém open source kolem peněženky EUDI rychle roste. Toto jsou nejdůležitější reference:

# 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...~...

Testování a prostředí Sandbox

Než přejdete do produkce, použijte oficiální prostředí sandbox:

  • Referenční aplikace EUDI peněženky: K dispozici na GitHubu (eu-digital-identity-wallet) jako open source aplikace pro Android/iOS. Zahrnuje demo vydavatele, demo ověřovače a test vydavatele PID.
  • Itálie IT Wallet Sandbox: PagoPA poskytuje testovací prostředí pro integraci, jako je Relying Party (kontakt komunita developers.italia.it pro přístup).
  • Nástroj pro testování shody EUDIW: Nástroj Komise EU pro testování souladu s prováděcími akty.

Plán pro italské vývojáře

Pokud pracujete pro veřejnou správu nebo pro soukromou společnost, která poskytuje služby italským občanům, zde jsou konkrétní akce které se mají provést v následujících měsících:

Kontrolní seznam připravenosti k peněžence EUDI

  • Aktualizujte svou strategii ověřování: zkombinujte OpenID4VP s SPID/CIE OIDC ještě dnes
  • Prostudujte si Definice prezentace pro vaše případy použití (jaké atributy skutečně potřebujete?)
  • Implementujte ověření SD-JWT ve své backendové aplikaci
  • Zaregistrujte svou službu jako spoléhající se strana v registru AgID, je-li k dispozici
  • Integrujte testování s referenční aplikací EUDI Wallet Reference (verze pro Android na GitHubu)
  • Vyškolte tým o GDPR a minimalizaci dat v kontextu VC
  • Sledujte prováděcí akty: technické specifikace se vyvíjejí do roku 2026

Závěry

eIDAS 2.0 a EUDI Wallet představují nejhlubší transformaci evropského prostředí digitální identity v posledních desetiletích. Pro vývojáře to znamená přijmout zcela nový technologický ekosystém: SD-JWT, OpenID4VCI, OpenID4VP, SIOPv2 a PKI pro celý kontinent.

Přechod není okamžitý – SPID a CIE budou fungovat paralelně po léta – ale čas začít se připravovat je nyní. Služby, které se včas přizpůsobí, budou mít skutečnou konkurenční výhodu a budou připraveny, až se masové přijetí peněženky EUDI transformuje očekávání uživatelů, pokud jde o soukromí, kontrolu a přeshraniční interoperabilitu.

Série GovTech pokračuje

Další informace o implementaci OpenID Connect pro vládní identitu naleznete v dalším článku série.