Contextul de reglementare: de la eIDAS 1.0 la eIDAS 2.0

Regulamentul eIDAS 1.0 (UE 910/2014) a pus bazele pentru interoperabilitatea sistemelor de identitate digitală în Uniunea Europeană, dar a arătat limitări evidente: adoptarea voluntară de către statele membre, fluxuri SAML 2.0 care nu sunt potrivite pentru lumea mobilă și absența unui portofel digital standardizate pentru cetăţeni. Zece ani mai târziu, Regulamentul UE 2024/1183 — cunoscut oficial ca eIDAS 2.0 — a intrat în vigoare cel 20 mai 2024 rescrierea regulilor jocului.

Cele mai relevante știri pentru dezvoltatori includ: obligația pentru toate statele membre de a emite a Portofelul de identitate digitală al Uniunii Europene (Portofel EUDI) până în 2026, introducerea Atestări electronice de atribute (EAA), conceptul de Atestarea electronică calificată a atributelor (QEAA), și obligația părților care se bazează (RP) din sectoarele reglementate de a accepta portofelul până în 2027.

Cronologie de reglementare eIDAS 2.0

  • 20 mai 2024 – Intrarea în vigoare a Regulamentului UE 2024/1183
  • 2025 – Publicarea actelor tehnice de implementare (ARF, protocoale)
  • 2026 – Toate statele UE trebuie să ofere portofele EUDI cetățenilor lor
  • 2027 – Părțile care se bazează în sectoarele reglementate sunt obligate să accepte EUDI Wallet

Arhitectura portofelului EUDI: Componentele fundamentale

Arhitectura de referință a portofelului EUDI este definită deArhitectură și Cadrul de Referință (ARF), documentatie tehnica menţinută de Comisia Europeană. Sistemul este format din patru straturi principale:

1. Nivelul emitentului — Cine emite acreditările

The Emitenţi sunt entitati autorizate sa emita certificate verificabile. Există două categorii principale:

  • Furnizorii PID: emit Datele de Identificare a Persoanei (PID), care reprezintă acreditările de identitate de bază eliberate de Stat (echivalent cu documentul de identitate digital).
  • Furnizorii de atestare: eliberează EAA (Electronic Attribute Attestations) — de exemplu permis de conducere, calificare educațională, card de sănătate, calificare profesională.

Protocolul standard de emitere este OpenID4VCI (OpenID pentru emiterea de acreditări verificabile), care extinde fluxul OAuth 2.0 cu puncte finale dedicate pentru solicitarea și eliberarea acreditărilor.

// 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. Strat portofel — Portofelul cetățeanului

Il Portofelul EUDI este o aplicație (mobilă sau web) pe care cetățeanul o folosește pentru a primi, stoca și prezenta acreditările. Acesta trebuie să fie certificat conform standardelor de securitate definite de Actele de implementare (EUCC - EU Cybersecurity Certification Scheme for Common Criteria). Caracteristicile cheie includ:

  • Gestionare securizată a cheilor criptografice (cu suport hardware atunci când este disponibil)
  • Suport pentru SD-JWT VC (Dezvăluire selectivă JWT Verifiable Credentials)
  • Suport pentru ISO 18013-5 (mdoc) pentru profilul permisului de conducere mobil
  • Prezentare de proximitate prin NFC/BLE (pentru controale fizice)
  • Prezentare de la distanță prin browser (redirecționare HTTPS)

3. Nivelul Verifier/Relying Party — Cine primește acreditările

I Părți care se bazează (RP) — numite și Verificatori în ecosistemul VC — sunt servicii care necesită autentificare sau verificarea atributelor cetăţeanului. Protocolul de depunere este OpenID4VP (OpenID pentru prezentări verificabile), folosit adesea în combinație cu SIOPv2 (furnizor OpenID auto-eliberat v2) pentru fluxuri autosuverane.

4. Infrastructura încrederii — Lanțul încrederii

Portofelul EUDI se bazează pe un Infrastructura cheie publică europeană (PKI). coordonat de Comisie. Fiecare Emitent trebuie să fie înregistrat înRegistrul emitenților de încredere EUDIW, iar verificatorii trebuie să se înregistreze ca părți de încredere. Are loc validarea acreditării prin verificarea semnăturii digitale a Emitentului prin certificate X.509 v3 ancorate la PKI națională a statului membru.

SD-JWT: Dezvăluire selectivă și confidențialitate

Unul dintre cele mai relevante aspecte tehnice ale eIDAS 2.0 este adoptarea SD-JWT (jetoane web JSON de divulgare selectivă), definit în RFC-ul IETF corespunzător. Ideea de bază este de a permite deținătorului să dezvăluie doar atributele necesare pentru o anumită tranzacție, fără a expune întregul act de identitate.

Principiul minimizării datelor

Cu SD-JWT, un cetățean poate dovedi că el sau ea este adult fără a dezvălui data exactă a nașterii. Sau demonstrați că locuiți într-o anumită municipalitate fără afișați adresa completă. Acesta este centrul principiului GDPR minimizarea datelor aplicat identităţii digitale.

Un SD-JWT este format din trei părți:

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

Implementați un portofel EUDI pentru partea de încredere

Dacă dezvoltați un serviciu digital care trebuie să accepte identitatea EUDI Wallet, trebuie să implementați a Verificator/Parte de încredere. Pașii principali sunt:

Pasul 1: Înregistrarea ca parte de încredere

Fiecare RP trebuie să se înregistreze în registrul național al intermediarilor și să obțină un certificat X.509 care va fi folosit pentru semnarea Cereri de autorizare trimis în portofel. În Italia, registrul este gestionat de AgID.

Pasul 2: creați o solicitare de autorizare (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
            }
          ]
        }
      }
    ]
  }
}

Pasul 3: Verificarea jetonului VP

Când portofelul răspunde cu a vp_token, Partea care se bazează trebuie să efectueze următoarele verificări:

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

Portofel IT Italiano: Stadiul tehnicii

Italia se apropie de ecosistemul EUDI Wallet prin propriul său sistem Portofel IT, prevăzută de Decretul legislativ 07/03/2024 nr. 31 și dezvoltat în cadrul PNRR. Sistemul este operat de PagoPA S.p.A. și integrează sistemele deja existente SPID și CIE (Carte electronică de identitate).

Portofelul IT este conceput ca o soluție de tranziție către portofelul conform EUDI și a început faza pilot de la începutul anului 2025 cu permisul de conducere digital, cardul de sănătate și certificatul de handicap ca primele acreditări disponibile.

Acreditări pentru portofelul IT (faza pilot 2025)

  • mDL – Permis de conducere mobil (ISO 18013-5)
  • TS-CNS – Card de Sanatate / Card National de Servicii
  • Certificat de handicap – Certificare INPS
  • PID – Date de identificare a persoanei (derivate din CIE)

OpenID4VP cu SIOPv2: fluxul între dispozitive

Un scenariu comun este flux între dispozitive: utilizatorul vizitează un site web pe desktop și folosește smartphone-ul pentru a se autentifica cu portofel. Fluxul tipic folosește un cod QR ca canal de comunicare inițial:

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

Interoperabilitate cu SPID și CIE

Dezvoltatorii italieni trebuie să înțeleagă cum coexistă sistemele actuale cu noul ecosistem EUDI:

Sistem Protocol Identitate Expirare Note
SPID SAML 2.0 / OIDC Federat (IdP privat) Operațional până în 2026+ Acesta va converge progresiv în EUDI
CIE (Cartea electronică de identitate) SAML 2.0 / OIDC / NFC Stat (Ministerul de Interne) Operațional pe termen lung Sursa PID pentru portofelul EUDI
Portofel IT (PagoPA) OpenID4VCI / OpenID4VP Portofelul național 2025+ (pilot) Trecerea la EUDI Wallet
Portofelul EUDI OpenID4VCI / OpenID4VP / SD-JWT UE (transfrontalier) Obligatoriu din 2026 Standard european definitiv

Considerații de securitate și criptografice

Implementarea EUDI Wallet necesită atenție asupra mai multor aspecte de securitate:

Legături de taste

Fiecare acreditare este legată criptografic de portofel (și, prin urmare, de dispozitivul fizic al cetățeanului) printr-un mecanism numit Legături de taste. Cheia privată a titularului nu trebuie să părăsească niciodată elementul securizat al dispozitivului. The JWT de legare a tastelor (KB-JWT) dovedește că prezentatorul deține cheia privată corespunzătoare cheii publice înregistrate în SD-JWT.

Prevenirea atacurilor la reluare

Câmpul nonce în Solicitarea de Autorizare este generată aleatoriu de către RP și trebuie inclusă în KB-JWT semnat de portofel. RP verifică dacă nonce se potrivește cu cel generat inițial, prevenind atacurile de reluare.

Avertisment: valabilitate temporală

Acreditările verificabile au o dată de expirare (exp). Serviciile trebuie să verifice întotdeauna că acreditările nu au expirat, și luați în considerare politicile de revocare (prin Status List sau mecanisme asemănătoare OCSP definite în Actele de Implementare).

Validarea certificatului

Certificatele de emitent trebuie validate de-a lungul lanțului PKI până la ancorele europene de încredere. Utilizați întotdeauna versiunea actualizată de Lista de încredere Uniunea Europeană (disponibil prin API de la Comisia UE).

Instrumente și biblioteci pentru dezvoltatori

Ecosistemul open source din jurul portofelului EUDI crește rapid. Acestea sunt cele mai importante referințe:

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

Medii de testare și Sandbox

Înainte de a intra în producție, utilizați mediile oficiale sandbox:

  • Aplicația de referință pentru portofelul EU EUDI: Disponibil pe GitHub (eu-digital-identity-wallet) ca aplicație open source pentru Android/iOS. Include demonstrația emitentului, demonstrația verificatorului și testul emitentului PID.
  • Italia IT Portofel Sandbox: PagoPA oferă un mediu de testare pentru integrare, cum ar fi Relying Party (contact comunitatea developers.italia.it pentru acces).
  • Instrument de testare a conformității EUDIW: instrument al Comisiei UE pentru testarea conformității cu actele de punere în aplicare.

Foaia de parcurs pentru dezvoltatorii italieni

Dacă lucrezi pentru o administrație publică sau pentru o companie privată care oferă servicii cetățenilor italieni, iată acțiunile concrete care urmează să fie întreprins în următoarele luni:

Listă de verificare EUDI Wallet Ready

  • Actualizați-vă strategia de autentificare: combinați OpenID4VP cu SPID/CIE OIDC astăzi
  • Studiază Definiție de prezentare pentru cazurile dvs. de utilizare (de ce atribute aveți cu adevărat nevoie?)
  • Implementați verificarea SD-JWT în aplicația dvs. de backend
  • Înregistrați-vă serviciul ca parte de încredere în registrul AgID atunci când este disponibil
  • Integrați testarea cu aplicația EUDI Wallet Reference (versiunea Android pe GitHub)
  • Antrenați echipa cu privire la GDPR și la minimizarea datelor în contextul VC
  • Monitorizarea actelor de implementare: specificațiile tehnice evoluează până în 2026

Concluzii

eIDAS 2.0 și EUDI Wallet reprezintă cea mai profundă transformare a peisajului identității digitale europene din ultimele decenii. Pentru dezvoltatori, aceasta înseamnă îmbrățișarea unui ecosistem tehnologic complet nou: SD-JWT, OpenID4VCI, OpenID4VP, SIOPv2 și un PKI la nivel de continent.

Tranziția nu este imediată – SPID și CIE vor continua să funcționeze în paralel ani de zile – dar momentul să începem pregătirea este acum. Serviciile care se adaptează devreme vor avea un avantaj competitiv real și vor fi gata atunci când adoptarea în masă a portofelului EUDI se va transforma așteptările utilizatorilor în ceea ce privește confidențialitatea, controlul și interoperabilitatea transfrontalieră.

Seria GovTech continuă

Aflați mai multe despre implementarea OpenID Connect pentru identitatea guvernamentală în următorul articol din serie.