eIDAS 2.0 en EUDI Wallet: wat een ontwikkelaar moet weten
De nieuwe Europese digitale identiteit krijgt vorm: met de eIDAS 2.0-verordening (EU 2024/1183) en de lancering van de Digital Identity Wallet van de Europese Unie, ontwikkelaars moeten Verifiable Credentials, OpenID4VC, SD-JWT en nieuwe authenticatiestromen beheersen. Een complete technische gids om te implementeren integratie met EUDI Wallet in zijn diensten.
De regelgevingscontext: van eIDAS 1.0 naar eIDAS 2.0
De verordening eIDAS 1.0 (EU 910/2014) had de basis gelegd voor de interoperabiliteit van digitale identiteitssystemen in de Europese Unie, maar vertoonde duidelijke beperkingen: vrijwillige adoptie door lidstaten, SAML 2.0-stromen die niet goed geschikt zijn voor de mobiele wereld, en de afwezigheid van een digitale portemonnee gestandaardiseerd voor burgers. Tien jaar later kwam de Verordening EU2024/1183 – formeel bekend als eIDAS 2.0 – is in werking getreden de 20 mei 2024 het herschrijven van de spelregels.
Het meest relevante nieuws voor ontwikkelaars is onder meer: de verplichting voor alle lidstaten om een Digitale identiteitsportefeuille van de Europese Unie (EUDI-portemonnee) tegen 2026, de introductie van Elektronische attribuutattesten (EAA), het concept van Gekwalificeerde elektronische attestatie van attributen (QEAA), en de verplichting voor Relying Parties (RP) in gereguleerde sectoren om de portemonnee tegen 2027 te accepteren.
eIDAS 2.0 Regelgeving Tijdlijn
- 20 mei 2024 – Inwerkingtreding van EU-verordening 2024/1183
- 2025 – Publicatie van technische uitvoeringshandelingen (ARF, protocollen)
- 2026 – Alle EU-staten moeten EUDI-portemonnees aanbieden aan hun burgers
- 2027 – Vertrouwende partijen in gereguleerde sectoren die verplicht zijn EUDI Wallet te accepteren
EUDI Wallet-architectuur: de fundamentele componenten
De referentiearchitectuur van de EUDI Wallet wordt gedefinieerd doorArchitectuur en Referentiekader (ARF), technische documentatie onderhouden door de Europese Commissie. Het systeem bestaat uit vier hoofdlagen:
1. Uitgeverlaag: wie geeft de inloggegevens uit
De Uitgevende instellingen zijn entiteiten die bevoegd zijn om verifieerbare certificaten uit te geven. Er zijn twee hoofdcategorieën:
- PID-aanbieders: zij geven de persoonsidentificatiegegevens (PID) uit, dit is het basisidentiteitsbewijs dat door de staat is uitgegeven (equivalent aan het digitale identiteitsdocument).
- Attestaanbieders: zij geven EAA (Electronic Attribute Attestations) af – bijvoorbeeld rijbewijs, onderwijskwalificatie, gezondheidskaart, beroepskwalificatie.
Het standaardprotocol voor uitgifte is OpenID4VCI (OpenID voor verifieerbare uitgifte van legitimatiegegevens), waarmee de OAuth 2.0-stroom wordt uitgebreid met speciale eindpunten voor het aanvragen en verstrekken van legitimatiegegevens.
// 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. Portemonneelaag — De portemonnee van de burger
Il EUDI-portemonnee het is een applicatie (mobiel of internet) die de burger gebruikt om zijn inloggegevens te ontvangen, op te slaan en te presenteren. Het moet worden gecertificeerd volgens de beveiligingsnormen die zijn gedefinieerd in de uitvoeringshandelingen (EUCC - EU Cybersecurity Certification Scheme for Common Criteria). De belangrijkste kenmerken zijn onder meer:
- Veilig beheer van cryptografische sleutels (hardware-ondersteund indien beschikbaar)
- Ondersteuning voor SD-JWT VC (Selective Disclosure JWT Verifiable Credentials)
- Ondersteuning voor ISO 18013-5 (mdoc) voor het mobiele rijbewijsprofiel
- Proximity-presentatie via NFC/BLE (voor fysieke bediening)
- Presentatie op afstand via browser (HTTPS-omleiding)
3. Laag van verificateur/vertrouwende partij: wie ontvangt de inloggegevens
I Vertrouwende partijen (RP) – ook wel Verifiers genoemd in het VC-ecosysteem – zijn diensten waarvoor authenticatie vereist is of de verificatie van de attributen van de burger. Het protocol voor indiening is OpenID4VP (OpenID voor verifieerbare presentaties), vaak gebruikt in combinatie met SIOPv2 (zelf uitgegeven OpenID-provider v2) voor zelf-soevereine stromen.
4. Vertrouwensinfrastructuur – De keten van vertrouwen
De EUDI-portemonnee is gebaseerd op a Europese publieke sleutelinfrastructuur (PKI). gecoördineerd door de Commissie. Elke Emittent moet geregistreerd zijn in deEUDIW-register van vertrouwde emittentenen verificateurs moeten zich registreren als vertrouwende partijen. Er vindt verificatie van de inloggegevens plaats door verificatie van de digitale handtekening van de Uitgever via X.509 v3-certificaten verankerd aan de nationale PKI van de lidstaat.
SD-JWT: Selectieve openbaarmaking en privacy
Een van de meest relevante technische aspecten van eIDAS 2.0 is de adoptie van SD-JWT (Selective Disclosure JSON-webtokens), gedefinieerd in de overeenkomstige IETF RFC. Het basisidee is om de houder in staat te stellen alleen de attributen te onthullen die nodig zijn voor een bepaalde transactie. zonder het hele identiteitsdocument bloot te leggen.
Principe van gegevensminimalisatie
Met SD-JWT kan een burger bewijzen dat hij of zij volwassen is, zonder de exacte geboortedatum prijs te geven. Of toon aan dat u zonder woonplaats in een bepaalde gemeente woont het volledige adres weergeven. Dit is de kern van het AVG-principe dataminimalisatie toegepast op digitale identiteit.
Een SD-JWT bestaat uit drie delen:
// 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~
Implementeer een Relying Party EUDI-portemonnee
Als u een digitale dienst ontwikkelt die de EUDI Wallet-identiteit moet accepteren, moet u een Verificateur/vertrouwende partij. De belangrijkste stappen zijn:
Stap 1: Registratie als Vertrouwende Partij
Elke RP moet zich registreren in het nationaal register van tussenpersonen en een X.509-certificaat verkrijgen dat zal worden gebruikt om de overeenkomst te ondertekenen. Autorisatieverzoeken naar de portemonnee gestuurd. In Italië wordt het register beheerd door AgID.
Stap 2: Maak een autorisatieverzoek aan (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
}
]
}
}
]
}
}
Stap 3: Verificatie van het VP-token
Wanneer de portemonnee reageert met een vp_tokenmoet de Vertrouwende Partij de volgende controles uitvoeren:
// 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-portemonnee Italiano: de stand van de techniek
Italië benadert het EUDI Wallet-ecosysteem via zijn eigen ecosysteem IT-portemonnee, voorzien bij wetsdecreet 07/03/2024 n. 31 and developed binnen de PNRR. Het systeem wordt beheerd door PagoPA S.p.A. en integreert de reeds bestaande SPID- en CIE-systemen (Electronic Identity Card).
De IT Wallet is ontworpen als overgangsoplossing naar de EUDI-compatibele Wallet en is sinds begin 2025 in de pilotfase begonnen met het digitale rijbewijs, de gezondheidskaart en het invaliditeitscertificaat als eerste beschikbare inloggegevens.
IT Wallet-referenties (pilotfase 2025)
- mDL – Mobiel rijbewijs (ISO 18013-5)
- TS-CNS – Gezondheidskaart / Nationale Dienstenkaart
- Certificaat van invaliditeit – INPS-certificering
- PID – Persoonsidentificatiegegevens (afgeleid van CIE)
OpenID4VP met SIOPv2: de cross-device-stroom
Een veel voorkomend scenario is het stroom tussen apparaten: de gebruiker bezoekt een website op de desktop en gebruikt de smartphone om zich te authenticeren met de portemonnee. De typische stroom gebruikt een QR-code als het eerste communicatiekanaal:
// 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
Interoperabiliteit met SPID en CIE
Italiaanse ontwikkelaars moeten begrijpen hoe de huidige systemen naast het nieuwe EUDI-ecosysteem bestaan:
| Systeem | Protocol | Identiteit | Vervaldatum | Opmerkingen |
|---|---|---|---|---|
| SPID | SAML 2.0 / OIDC | Gefedereerd (privé IdP) | Operationeel tot 2026+ | Het zal geleidelijk convergeren naar EUDI |
| CIE (elektronische identiteitskaart) | SAML 2.0 / OIDC / NFC | Staat (ministerie van Binnenlandse Zaken) | Lange termijn operationeel | PID-bron voor EUDI Wallet |
| IT-portemonnee (PagoPA) | OpenID4VCI / OpenID4VP | Nationale portemonnee | 2025+ (pilot) | Overgang naar EUDI Wallet |
| EUDI-portemonnee | OpenID4VCI / OpenID4VP / SD-JWT | EU (grensoverschrijdend) | Verplicht vanaf 2026 | Definitieve Europese norm |
Beveiligings- en cryptografische overwegingen
De implementatie van EUDI Wallet vereist aandacht voor verschillende beveiligingsaspecten:
Sleutelbindingen
Elke inloggegevens zijn cryptografisch gekoppeld aan de portemonnee (en dus aan het fysieke apparaat van de burger) via een mechanisme dat ' Sleutelbindingen. De privésleutel van de houder mag het beveiligde deel van het apparaat nooit verlaten. De Sleutelbindend JWT (KB-JWT) bewijst dat de presentator over de privésleutel beschikt die overeenkomt met de openbare sleutel die is geregistreerd in de SD-JWT.
Preventie van herhalingsaanvallen
Het veld nonce in het Autorisatieverzoek wordt het willekeurig gegenereerd door de RP en moet het worden opgenomen in de KB-JWT, ondertekend door de portemonnee.
De RP verifieert dat de nonce overeenkomt met de oorspronkelijk gegenereerde nonce, waardoor replay-aanvallen worden voorkomen.
Waarschuwing: tijdelijke geldigheid
Verifieerbare inloggegevens hebben een vervaldatum (exp). De diensten moeten altijd verifiëren dat de identificatie niet is verlopen,
en het intrekkingsbeleid overwegen (via Statuslijst of OCSP-achtige mechanismen gedefinieerd in de Uitvoeringshandelingen).
Certificaatvalidatie
Uitgeverscertificaten moeten worden gevalideerd langs de PKI-keten tot aan de Europese vertrouwensankers. Gebruik altijd de bijgewerkte versie van Vertrouwde lijst Europese Unie (beschikbaar via API van de Europese Commissie).
Ontwikkelaarstools en bibliotheken
Het open source-ecosysteem rond EUDI Wallet groeit snel. Dit zijn de belangrijkste referenties:
# 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...~...
Test- en sandbox-omgevingen
Gebruik de officiële sandbox-omgevingen voordat u naar productie gaat:
- EU EUDI Wallet-referentietoepassing: Beschikbaar op GitHub (eu-digital-identity-wallet) als een open source Android/iOS-app. Inclusief uitgeversdemo, verificateursdemo en PID-uitgeverstest.
- Italië IT Wallet Sandbox: PagoPA biedt testomgeving voor integratie zoals Relying Party (contact de ontwikkelaars.italia.it-gemeenschap voor toegang).
- EUDIW-conformiteitstesttool: instrument van de Europese Commissie voor het testen van de naleving van de uitvoeringshandelingen.
Roadmap voor Italiaanse ontwikkelaars
Als u voor een overheidsinstantie werkt of voor een particulier bedrijf dat diensten levert aan Italiaanse burgers, volgen hier de concrete acties komende maanden te ondernemen:
EUDI Wallet Ready-checklist
- Update uw authenticatiestrategie: combineer OpenID4VP vandaag nog met SPID/CIE OIDC
- Bestudeer de Presentatiedefinitie voor uw gebruiksscenario's (welke attributen heeft u echt nodig?)
- Implementeer SD-JWT-verificatie in uw backend-applicatie
- Registreer uw dienst als Relying Party in het AgID-register indien beschikbaar
- Integreer testen met de EUDI Wallet Reference App (Android-versie op GitHub)
- Train het team op het gebied van AVG en dataminimalisatie in de VC-context
- Monitor de uitvoeringshandelingen: de technische specificaties evolueren tot 2026
Conclusies
eIDAS 2.0 en de EUDI Wallet vertegenwoordigen de meest diepgaande transformatie van het Europese digitale identiteitslandschap van de afgelopen decennia. Voor ontwikkelaars betekent dit het omarmen van een geheel nieuw technologie-ecosysteem: SD-JWT, OpenID4VCI, OpenID4VP, SIOPv2 en een continentbrede PKI.
De transitie vindt niet onmiddellijk plaats – SPID en CIE zullen jarenlang parallel blijven opereren – maar het is nu tijd om met de voorbereidingen te beginnen. Diensten die zich vroegtijdig aanpassen zullen een echt concurrentievoordeel hebben en zullen klaar zijn wanneer de massale adoptie van de EUDI Wallet verandert gebruikersverwachtingen op het gebied van privacy, controle en grensoverschrijdende interoperabiliteit.
De GovTech-serie gaat verder
Lees meer over het implementeren van OpenID Connect voor overheidsidentiteit in het volgende artikel in de serie.







