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.