eIDAS 2.0 i portfel EUDI: co programista musi wiedzieć
Nowa europejska tożsamość cyfrowa nabiera kształtu: wraz z rozporządzeniem eIDAS 2.0 (UE 2024/1183) i uruchomieniem portfela tożsamości cyfrowej Unii Europejskiej, programiści muszą opanować weryfikowalne poświadczenia, OpenID4VC, SD-JWT i nowe przepływy uwierzytelniania. Kompletny przewodnik techniczny do wdrożenia integrację z portfelem EUDI w swoich usługach.
Kontekst regulacyjny: od eIDAS 1.0 do eIDAS 2.0
Rozporządzenie eIDAS 1.0 (UE 910/2014) położyło podwaliny pod interoperacyjność systemów tożsamości cyfrowej w Unii Europejskiej, ale wykazał oczywiste ograniczenia: dobrowolne przyjęcie przez państwa członkowskie, przepływy SAML 2.0, które nie są dobrze dostosowane do mobilnego świata oraz brak portfela cyfrowego ustandaryzowane dla obywateli. Dziesięć lat później rozporządzenie UE 2024/1183 – formalnie znany jako eIDAS 2.0 – wszedł w życie the 20 maja 2024 r przepisania reguł gry.
Najważniejszymi wiadomościami dla deweloperów są: obowiązek wydania przez wszystkie państwa członkowskie a Portfel tożsamości cyfrowej Unii Europejskiej (portfel EUDI) do 2026 r. wprowadzenie Elektroniczne poświadczenia atrybutów (EAA), koncepcja Kwalifikowane elektroniczne poświadczenie atrybutów (QEAA), oraz obowiązek akceptacji portfela przez strony ufające (RP) w sektorach regulowanych do 2027 r.
Harmonogram rozporządzenia eIDAS 2.0
- 20 maja 2024 r – Wejście w życie Rozporządzenia UE 2024/1183
- 2025 – Publikacja technicznych aktów wykonawczych (ARF, protokołów)
- 2026 – Wszystkie państwa UE muszą oferować swoim obywatelom portfele EUDI
- 2027 – Strony ufające w sektorach regulowanych zobowiązane do akceptowania Portfela EUDI
Architektura portfela EUDI: podstawowe elementy
Architekturę referencyjną portfela EUDI definiujeArchitektura i ramy odniesienia (ARF), dokumentacja techniczna utrzymywana przez Komisję Europejską. System składa się z czterech głównych warstw:
1. Warstwa wystawcy — kto wystawia dane uwierzytelniające
The Emitenci są podmiotami uprawnionymi do wydawania weryfikowalnych certyfikatów. Istnieją dwie główne kategorie:
- Dostawcy PID: wydają dane identyfikacyjne osoby (PID), które stanowią podstawowy dokument potwierdzający tożsamość wydawany przez państwo (równoważny z cyfrowym dokumentem tożsamości).
- Dostawcy atestów: wydają EAA (elektroniczne zaświadczenia o atrybutach) — na przykład prawo jazdy, wykształcenie, kartę zdrowia, kwalifikacje zawodowe.
Standardowym protokołem wydania jest OpenID4VCI (OpenID do weryfikowalnego wydawania danych uwierzytelniających), który rozszerza przepływ protokołu OAuth 2.0 o dedykowane punkty końcowe do żądania i wydawania poświadczeń.
// 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. Warstwa portfela — portfel obywatela
Il Portfel EUDI jest to aplikacja (mobilna lub internetowa), za pomocą której obywatel otrzymuje, przechowuje i przedstawia swoje dane uwierzytelniające. Musi być certyfikowany zgodnie ze standardami bezpieczeństwa określonymi w Aktach Wykonawczych (EUCC – EU Cybersecurity Certification Scheme for Common Criteria). Kluczowe funkcje obejmują:
- Bezpieczne zarządzanie kluczami kryptograficznymi (wspomagane sprzętowo, jeśli jest dostępne)
- Wsparcie dla SD-JWT VC (weryfikowalne poświadczenia JWT dotyczące selektywnego ujawniania informacji)
- Obsługa ISO 18013-5 (mdoc) dla profilu mobilnego prawa jazdy
- Prezentacja zbliżeniowa poprzez NFC/BLE (w przypadku kontroli fizycznej)
- Zdalna prezentacja przez przeglądarkę (przekierowanie HTTPS)
3. Weryfikator/warstwa strony ufającej — kto otrzymuje dane uwierzytelniające
I Strony ufające (RP) — zwane także weryfikatorami w ekosystemie VC — to usługi wymagające uwierzytelnienia lub weryfikacja atrybutów obywatela. Protokół złożenia jest OpenID4VP (OpenID dla weryfikowalnych prezentacji), często używane w połączeniu z SIOPv2 (samodzielnie wydany dostawca OpenID v2) dla suwerennych przepływów.
4. Infrastruktura zaufania – łańcuch zaufania
Portfel EUDI opiera się na Europejska infrastruktura klucza publicznego (PKI). koordynowane przez Komisję. Każdy Emitent musi być zarejestrowany wRejestr Zaufanych Emitentów EUDIW, a weryfikatorzy muszą zarejestrować się jako strony ufające. Następuje weryfikacja poświadczeń poprzez weryfikację podpisu cyfrowego Emitenta poprzez certyfikaty X.509 v3 zakotwiczone w krajowej PKI państwa członkowskiego.
SD-JWT: Wybiórcze ujawnianie informacji i prywatność
Jednym z najważniejszych aspektów technicznych eIDAS 2.0 jest przyjęcie SD-JWT (tokeny internetowe JSON do selektywnego ujawniania informacji), zdefiniowany w odpowiednim dokumencie RFC IETF. Podstawową ideą jest umożliwienie posiadaczowi ujawnienia jedynie atrybutów niezbędnych dla danej transakcji, bez ujawniania całego dokumentu tożsamości.
Zasada minimalizacji danych
Dzięki SD-JWT obywatel może udowodnić, że jest pełnoletni, nie podając przy tym dokładnej daty urodzenia. Lub udowodnij, że mieszkasz w określonej gminie bez wyświetlić pełny adres. To jest sedno zasady RODO minimalizacja danych zastosowane do tożsamości cyfrowej.
SD-JWT składa się z trzech części:
// 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~
Zaimplementuj portfel EUDI strony ufającej
Jeśli tworzysz usługę cyfrową, która musi akceptować tożsamość portfela EUDI, musisz wdrożyć a Weryfikator/strona uzależniona. Główne kroki to:
Krok 1: Rejestracja jako strona ufająca
Każdy RP musi zarejestrować się w krajowym rejestrze pośredników i uzyskać certyfikat X.509, który będzie służył do podpisywania umowy Żądania autoryzacyjne wysłane do portfela. We Włoszech rejestrem zarządza AgID.
Krok 2: Utwórz żądanie autoryzacji (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: Weryfikacja tokena VP
Kiedy portfel odpowie komunikatem a vp_token, Strona ufająca musi przeprowadzić następujące kontrole:
// 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
Portfel IT Italiano: najnowocześniejsza technologia
Włochy wykorzystują własny ekosystem portfela EUDI Portfel IT, przewidziany w dekrecie legislacyjnym z dnia 07.03.2024 n. 31 i rozwinięty w ramach PNRR. System obsługiwany jest przez PagoPA S.p.A. oraz integruje już istniejące systemy SPID i CIE (Electronic Identity Card).
Portfel IT został zaprojektowany jako rozwiązanie przejściowe w kierunku Portfela zgodnego z EUDI i rozpoczął fazę pilotażową od początku 2025 roku z cyfrowym prawem jazdy, kartą zdrowia i orzeczeniem o niepełnosprawności jako pierwszymi dostępnymi dokumentami uwierzytelniającymi.
Dane uwierzytelniające portfela IT (faza pilotażowa 2025 r.)
- mDL – Mobilne prawo jazdy (ISO 18013-5)
- TS-CNS – Karta Zdrowia/Karta Usług Narodowych
- Świadectwo niepełnosprawności – Certyfikat INPS
- PID – Dane identyfikacyjne osoby (pochodzące z CIE)
OpenID4VP z SIOPv2: przepływ między urządzeniami
Typowym scenariuszem jest przepływ między urządzeniami: użytkownik odwiedza stronę internetową na komputerze i używa smartfona do uwierzytelnienia w portfelu. Typowy przepływ wykorzystuje kod QR jako początkowy kanał komunikacji:
// 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
Współpraca z SPID i CIE
Włoscy programiści muszą zrozumieć, w jaki sposób obecne systemy współistnieją z nowym ekosystemem EUDI:
| System | Protokół | Tożsamość | Wygaśnięcie | Notatki |
|---|---|---|---|---|
| SPID | SAML 2.0 / OIDC | Sfederowany (prywatny dostawca tożsamości) | Działa do 2026+ | Stopniowo będzie przekształcać się w EUDI |
| CIE (elektroniczny dowód tożsamości) | SAML 2.0 / OIDC / NFC | Stan (Ministerstwo Spraw Wewnętrznych) | Długoterminowo sprawny | Źródło PID dla portfela EUDI |
| Portfel IT (PagoPA) | OpenID4VCI/OpenID4VP | Portfel narodowy | 2025+ (pilotaż) | Przejście na portfel EUDI |
| Portfel EUDI | OpenID4VCI/OpenID4VP/SD-JWT | UE (transgraniczna) | Obowiązkowe od 2026 r | Ostateczny standard europejski |
Względy bezpieczeństwa i kryptografii
Wdrożenie portfela EUDI wymaga zwrócenia uwagi na kilka aspektów bezpieczeństwa:
Powiązania klawiszy
Każde dane uwierzytelniające są kryptograficznie powiązane z portfelem (a tym samym z fizycznym urządzeniem obywatela) za pośrednictwem mechanizmu zwanego Powiązania klawiszy. Klucz prywatny posiadacza nie może nigdy opuścić bezpiecznego elementu urządzenia. The Wiązanie kluczy JWT (KB-JWT) udowadnia, że prezenter posiada klucz prywatny odpowiadający kluczowi publicznemu zarejestrowanemu w SD-JWT.
Zapobieganie atakom powtórkowym
Pole nonce w Żądaniu Autoryzacji jest on losowo generowany przez RP i musi być uwzględniony w podpisanym przez portfel KB-JWT.
RP sprawdza, czy wartość jednorazowa jest zgodna z pierwotnie wygenerowaną, zapobiegając atakom polegającym na powtórzeniu.
Ostrzeżenie: ważność tymczasowa
Weryfikowalne dane uwierzytelniające mają datę ważności (exp). Służby muszą zawsze sprawdzać, czy dane uwierzytelniające nie wygasły,
i rozważ zasady unieważnień (poprzez Listę Statusów lub mechanizmy podobne do OCSP określone w Aktach Wykonawczych).
Walidacja certyfikatu
Certyfikaty wystawcy muszą zostać zweryfikowane w całym łańcuchu PKI aż do europejskich kotwic zaufania. Zawsze używaj zaktualizowanej wersji z Zaufana lista Unia Europejska (dostępne poprzez API Komisji Europejskiej).
Narzędzia programistyczne i biblioteki
Ekosystem open source wokół portfela EUDI szybko się rozwija. Oto najważniejsze referencje:
# 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...~...
Środowiska testowe i piaskownice
Przed przejściem do produkcji skorzystaj z oficjalnych środowisk piaskownicy:
- Aplikacja referencyjna portfela EUDI: Dostępne w serwisie GitHub (eu-digital-identity-wallet) jako aplikacja typu open source dla systemu Android/iOS. Zawiera demo wystawcy, demo weryfikatora i test wystawcy PID.
- Piaskownica portfela IT we Włoszech: PagoPA udostępnia środowisko testowe do integracji typu Relying Party (kontakt społeczność deweloperów.italia.it w celu uzyskania dostępu).
- Narzędzie do testowania zgodności EUDIW: Narzędzie Komisji Europejskiej służące do sprawdzania zgodności z aktami wykonawczymi.
Mapa drogowa dla włoskich programistów
Jeśli pracujesz dla administracji publicznej lub dla prywatnej firmy świadczącej usługi obywatelom Włoch, oto konkretne działania które zostaną podjęte w nadchodzących miesiącach:
Lista kontrolna gotowego portfela EUDI
- Zaktualizuj swoją strategię uwierzytelniania: połącz OpenID4VP z SPID/CIE OIDC już dziś
- Przestudiuj Definicja prezentacji dla Twoich przypadków użycia (jakich atrybutów naprawdę potrzebujesz?)
- Zaimplementuj weryfikację SD-JWT w swojej aplikacji zaplecza
- Zarejestruj swoją usługę jako Stronę Uzależnioną w rejestrze AgID, jeśli jest dostępna
- Zintegruj testowanie z aplikacją EUDI Wallet Reference (wersja na Androida w GitHub)
- Przeszkol zespół w zakresie RODO i minimalizacji danych w kontekście VC
- Monitorowanie aktów wykonawczych: specyfikacje techniczne będą ewoluować do 2026 r
Wnioski
eIDAS 2.0 i portfel EUDI reprezentują najgłębszą transformację europejskiego krajobrazu tożsamości cyfrowej w ostatnich dziesięcioleciach. Dla programistów oznacza to wykorzystanie całkowicie nowego ekosystemu technologicznego: SD-JWT, OpenID4VCI, OpenID4VP, SIOPv2 i ogólnokontynentalnej infrastruktury PKI.
Przejście nie jest natychmiastowe — SPID i CIE będą nadal działać równolegle przez lata — ale czas rozpocząć przygotowania już teraz. Usługi, które dostosują się wcześniej, będą miały prawdziwą przewagę konkurencyjną i będą gotowe, gdy nastąpi masowe przyjęcie portfela EUDI oczekiwań użytkowników w zakresie prywatności, kontroli i interoperacyjności transgranicznej.
Seria GovTech trwa
Dowiedz się więcej o wdrażaniu OpenID Connect dla tożsamości rządowej w następnym artykule z tej serii.







