Salt la conținutul principal

WUA pe înțeles: cum își dovedește un portofel autenticitatea față de un emitent

O Wallet Unit Attestation, WUA, este ceea ce un EUDI Wallet arată unui PID Provider sau Attestation Provider în timpul emiterii pentru a dovedi că este autentic. Nu este un singur document, ci două, ambele semnate de furnizorul de portofel: un Wallet Instance Attestation (WIA) despre aplicația portofelului și o Key Attestation (KA) despre stocarea securizată a cheilor de care va fi legată o acreditare.

Problema pe care o rezolvă o WUA

Un emitent care urmează să predea unui portofel un PID sau o acreditare de înregistrare a unei companii nu are o modalitate integrată de a deosebi un EUDI Wallet certificat de o aplicație modificată sau de un script care reia un flux de autorizare. Nici nu poate vedea dacă cheia de care va fi legată acreditarea se află în hardware securizat certificat sau într-o stocare obișnuită, de unde ar putea fi copiată.

WUA acoperă ambele lacune. Furnizorul de portofel garantează pentru aplicație prin WIA și pentru stocarea cheilor prin Key Attestation. Emitentul le verifică pe amândouă înainte de emitere și continuă să le verifice starea de revocare și după aceea, astfel încât să poată revoca ce a emis dacă ulterior se descoperă că portofelul sau stocarea cheilor a fost compromisă.

O WUA este folosită doar în timpul emiterii. ARF interzice unei unități de portofel să prezinte un WIA sau o Key Attestation unei Relying Party, ceea ce ține detaliile portofelului în afara oricărei prezentări.

Actorii și cine are încredere în cine

Sunt implicate cinci roluri, și doar patru dintre ele au vreodată de-a face cu o WUA. WSCD-ul (Wallet Secure Cryptographic Device) sau un keystore generează și protejează cheile, furnizorul de portofel garantează pentru aplicație și chei, iar emitentul se bazează pe acest lucru în loc să evalueze singur portofelul.

Furnizor de portofel

Semnează WIA-uri și Key Attestations după ce verifică aplicația și stocarea cheilor, și administrează Status Lists pentru ambele

Instanță de portofel

Trimite emitentului un WIA și o Key Attestation în timpul emiterii și folosește fiecare doar pentru o singură emitere

WSCD sau keystore

Generează și păstrează cheile private descrise de o Key Attestation

PID Provider sau Attestation Provider

Verifică WIA-ul și Key Attestation, leagă acreditarea de o cheie atestată și continuă să verifice dacă vreunul dintre ele a fost revocat

Relying Party

Nu primește niciodată o WUA. În schimb, verifică acreditarea, legarea ei de dispozitiv și starea ei de revocare

Emitenții au încredere într-o WUA pentru că certificatul de semnare al furnizorului de portofel, trimis în antetul x5c, se înlănțuie până la o ancoră de încredere din Trusted List pentru furnizorii de portofel. Wallet Solution în sine este certificată de un organism de evaluare a conformității, iar WIA-ul conține informațiile despre această certificare.

Două atestări sub un singur nume

TS3, specificația tehnică EUDI pentru WUA, împarte atestarea în două, pentru că aplicația și stocarea cheilor sunt lucruri diferite, verificate la endpointuri diferite și revocate din motive diferite.

Wallet Instance Attestation (WIA)

Atestă
Integritatea Wallet Instance, adică a aplicației
Trimis către
Authorization Server, în Pushed Authorization Request și în Token Request
Valabilitate
Mai puțin de 24 de ore
Revocare
client_status: starea de revocare a acestei Wallet Instance
Necesar pentru
Orice emitere, legată de dispozitiv sau nu

Key Attestation (KA)

Atestă
Că una sau mai multe chei au fost generate într-un WSCD sau keystore anume și sunt păstrate de acesta, și cât de bine rezistă acea stocare la atacuri
Trimis către
Credential Issuer, în proofs din Credential Request
Valabilitate
Stabilită de furnizorul de portofel, poate fi mai lungă decât a unui WIA
Revocare
key_storage_status: starea de revocare a WSCD-ului sau keystore-ului
Necesar pentru
Doar acreditările legate de dispozitiv, inclusiv orice PID

Ambele sunt JWT-uri semnate de furnizorul de portofel cu ES256, ES384 sau ES512. O Key Attestation este folosită pentru o singură emitere, iar un WIA nu este niciodată reutilizat față de un alt emitent, astfel încât emitenții nu pot corela cererile venite de la același portofel.

Cum își obține o unitate de portofel WIA-urile și Key Attestations

TS3 lasă acest pas la latitudinea fiecărui furnizor de portofel, deoarece are loc în interiorul unui singur produs de portofel. ARF cere doar ca furnizorul de portofel să verifice integritatea aplicației înainte de a semna un WIA și să verifice că cheile private atestate se află cu adevărat în WSCD-ul sau keystore-ul indicat înainte de a semna o Key Attestation. Un flux tipic, care folosește ca dovadă atestări ale platformei precum Google Play Integrity sau Apple DeviceCheck, arată astfel.

1. Instanță de portofel

Cere WSCD-ului sau keystore-ului să genereze perechi de chei

generează chei

2. WSCD sau keystore

Returnează cheile publice, împreună cu dovezi de la platformă despre locul în care au fost generate

chei publice + dovezi

3. Furnizor de portofel

Verifică integritatea aplicației și dovezile privind cheile, apoi semnează WIA-uri și Key Attestations

WIA + KA

4. Instanță de portofel

Păstrează o rezervă de WIA-uri și Key Attestations noi și folosește unul nou la fiecare emitere

Ce conțin un WIA și o Key Attestation

Niciunul nu conține un claim iss: emitentul identifică furnizorul de portofel după certificatul de semnare din antetul x5c. Exemplele de mai jos sunt decodificate, cu antetul și payload-ul separate printr-un punct.

Wallet Instance Attestation

{
  "typ": "oauth-client-attestation+jwt",
  "alg": "ES256",
  "x5c": ["MIIC..."]
}.{
  "sub": "https://wallet.example.eu",
  "wallet_name": "ExampleWallet-mobile",
  "wallet_version": "2.3.0",
  "wallet_link": "https://wallet.example.eu/about",
  "wallet_solution_certification_information": "https://wallet.example.eu/certification/2-3-0",
  "exp": 1789329600,
  "client_status": {
    "status": {
      "status_list": { "idx": 48213, "uri": "https://wallet.example.eu/status/wia/17" }
    },
    "exp": 1791936000
  },
  "cnf": {
    "jwk": { "kty": "EC", "crv": "P-256", "x": "...", "y": "..." }
  }
}
CâmpCe îi spune emitentului
typ / x5cCă este un client attestation, și lanțul de certificate al furnizorului de portofel, de verificat în raport cu Trusted List
subTipul de portofel, același pentru fiecare instalare, astfel încât nu poate fi folosit pentru a urmări un utilizator
wallet_name / wallet_versionWallet Solution așa cum apare în Trusted List, și versiunea acesteia
wallet_solution_certification_informationCine a certificat Wallet Solution; conținutul exact nu a fost încă definit
expExpirarea tehnică, la mai puțin de 24 de ore după verificarea integrității
client_statusO intrare din Status List pentru această Wallet Instance și data până la care furnizorul de portofel o ține la zi
cnfCheia care semnează dovada de posesie trimisă împreună cu WIA-ul

Key Attestation

{
  "typ": "key-attestation+jwt",
  "alg": "ES256",
  "x5c": ["MIIC..."]
}.{
  "iat": 1789257600,
  "exp": 1791936000,
  "certification": "https://wallet.example.eu/certification/wscd/secure-element",
  "key_storage": ["iso_18045_high"],
  "user_authentication": ["iso_18045_high"],
  "attested_keys": [
    { "kty": "EC", "crv": "P-256", "x": "...", "y": "..." },
    { "kty": "EC", "crv": "P-256", "x": "...", "y": "..." }
  ],
  "key_storage_status": {
    "status": {
      "status_list": { "idx": 3, "uri": "https://wallet.example.eu/status/ka/1" }
    },
    "exp": 1794614400
  }
}
CâmpCe îi spune emitentului
typ / x5cCă este o key attestation, și lanțul de certificate al furnizorului de portofel, de verificat în raport cu Trusted List
iat / expCând a fost emisă și când expiră din punct de vedere tehnic
attested_keysChei publice ale căror chei private au fost generate și sunt păstrate de WSCD sau keystore; mai multe chei permit emiterea în lot
key_storage / user_authenticationCât de bine rezistă la atacuri stocarea și autentificarea utilizatorului care deblochează cheile; un WSCD este întotdeauna iso_18045_high pentru ambele
certificationCertificarea WSCD-ului sau keystore-ului, din care emitentul își poate da seama dacă este un WSCD
key_storage_statusO intrare din Status List pentru WSCD sau keystore și data până la care furnizorul de portofel o ține la zi
noncec_nonce-ul emitentului, prezent doar atunci când Key Attestation este trimisă ca attestation proof

Pe unde circulă o WUA în timpul emiterii OpenID4VCI

Cele două atestări ajung în locuri diferite. WIA-ul autentifică portofelul ca client OAuth la Authorization Server. Key Attestation ajunge la Credential Issuer împreună cu cererea pentru acreditarea propriu-zisă.

Authorization Server primește WIA-ul

OAuth-Client-AttestationOAuth-Client-Attestation-PoP
  • Semnătura WIA-ului se înlănțuie până la Trusted List pentru furnizorii de portofel
  • WIA-ul nu a expirat, iar Wallet Instance nu este revocată
  • Dovada de posesie este semnată cu cheia din claim-ul cnf al WIA-ului

Credential Issuer primește Key Attestation

proofs.jwt[].key_attestationproofs.attestation
  • Semnătura Key Attestation se înlănțuie până la Trusted List pentru furnizorii de portofel
  • c_nonce-ul proaspăt al emitentului se află în jwt proof sau chiar în Key Attestation
  • WSCD-ul sau keystore-ul nu este revocat, iar acreditarea este legată de una dintre attested_keys

Pushed Authorization Request cu WIA-ul

POST /par HTTP/1.1
Host: issuer.example.eu
Content-Type: application/x-www-form-urlencoded
OAuth-Client-Attestation: <WIA JWT>
OAuth-Client-Attestation-PoP: <PoP JWT signed with the WIA cnf key>

response_type=code
&client_id=https%3A%2F%2Fwallet.example.eu
&scope=company_registration
&code_challenge=<S256 challenge>
&code_challenge_method=S256
&redirect_uri=<wallet redirect URI>

client_id corespunde cu sub din WIA. Token Request conține aceleași două antete. Deoarece Credential Issuer nu vede niciodată WIA-ul, Authorization Server trebuie să îi transmită client_status, de exemplu în access token.

Credential Request cu Key Attestation

POST /credential HTTP/1.1
Host: issuer.example.eu
Authorization: DPoP <access_token>
DPoP: <DPoP proof JWT>
Content-Type: application/json

{
  "credential_configuration_id": "company_registration",
  "proofs": {
    "jwt": ["<proof JWT: Key Attestation in its key_attestation header, signed with attested_keys[0]>"]
  }
}

Cu tipul de proof attestation, cererea conține în schimb "proofs": { "attestation": ["<JWT Key Attestation>"] }. În acest caz nu există dovadă de posesie: unitatea de portofel transmite c_nonce-ul emitentului furnizorului de portofel, care îl include într-o Key Attestation proaspăt semnată.

Ciclul de viață al WUA

O WUA are intenționat o durată scurtă și o singură utilizare, dar informațiile de revocare din spatele ei durează mai mult decât tokenul însuși. Primele trei etape sunt de rutină; a patra apare doar atunci când ceva nu merge bine.

1. Emitere

Furnizorul de portofel semnează WIA-uri și Key Attestations după verificările de integritate și de stocare a cheilor

2. O singură utilizare

Fiecare servește unei singure emiteri, așa că unitatea de portofel obține în permanență altele noi

3. Revocare în lanț

Un PID Provider reverifică starea WIA-ului și a Key Attestation cel puțin o dată la 24 de ore și revocă PID-ul dacă oricare dintre ele este revocat

4. Revocare

Furnizorul de portofel revocă o Wallet Instance, de exemplu după pierdere sau furt, ori un WSCD sau keystore cu o vulnerabilitate de securitate

În afara ecosistemului EUDI Wallet, unii furnizori de portofel emit atestări de portofel cu o durată de viață foarte scurtă și fără nicio referință de stare, bazându-se pe expirare în loc de revocare; OpenID4VCI face claim-ul de stare opțional. TS3 nu permite acest lucru pentru EUDI Wallets. WIA-ul durează deja mai puțin de 24 de ore, dar atât WIA-ul, cât și Key Attestation trebuie să conțină o referință de stare pe care furnizorul de portofel o menține cel puțin 31 de zile, deoarece PID Providers o folosesc pentru a revoca PID-uri mult după emitere.

WUA, WIA și KA: ce înseamnă fiecare termen

Terminologia s-a schimbat pe măsură ce specificațiile s-au maturizat. TS3 a numit WIA-ul Wallet App Attestation până la versiunea 1.1 și a folosit WUA pentru ceea ce acum este Key Attestation până la versiunea 1.5. De aceea, articolele mai vechi și versiunile preliminare ale ARF folosesc termenii diferit.

TermenCe acoperăCine o primește
WUATermen generic pentru cele două atestări de mai josPID Providers și Attestation Providers, doar în timpul emiterii
WIAWallet Instance, adică aplicațiaAuthorization Server, în Pushed Authorization Request și Token Request
KAUn WSCD sau keystore și cheile pe care le păstreazăCredential Issuer, în proofs din Credential Request

Termeni înrudiți

Întrebări frecvente

Este o WUA același lucru cu un Wallet Instance Attestation?

Nu. Începând cu versiunea 1.5 a TS3, WUA este termenul generic pentru două atestări: Wallet Instance Attestation (WIA), care acoperă aplicația, și Key Attestation (KA), care acoperă WSCD-ul sau keystore-ul în care se află cheile. Documentele mai vechi folosesc WUA pentru ceea ce acum se numește Key Attestation, motiv pentru care termenii sunt adesea confundați.

Vede vreodată un verificator WUA?

Nu. Cerințele ARF WUA_07 și WUA_24 permit unei unități de portofel să prezinte un WIA sau o Key Attestation doar unui PID Provider sau Attestation Provider în timpul emiterii, niciodată unei Relying Party. Verificatorul controlează în schimb acreditarea: semnătura, legarea de dispozitiv și starea de revocare. Dacă portofelul din spatele unui PID este revocat, PID Provider revocă PID-ul în cadrul ciclului său de verificare de 24 de ore, iar verificatorul vede acest lucru prin starea PID-ului însuși.

Cât timp este valabilă o WUA?

Un WIA expiră la mai puțin de 24 de ore după ce furnizorul de portofel a verificat integritatea aplicației. O Key Attestation poate fi valabilă mai mult timp, la latitudinea furnizorului de portofel. Separat, fiecare conține o dată de menținere a stării, client_status.exp sau key_storage_status.exp, până la care furnizorul de portofel ține starea de revocare la zi. Unitatea de portofel trebuie să poată prezenta întotdeauna una a cărei dată este la cel puțin 31 de zile distanță, iar un PID trebuie să expire înainte de acea dată.

Ce se întâmplă dacă o unitate de portofel este compromisă înainte ca WUA sa să expire?

Furnizorul de portofel revocă Wallet Instance în Status List-ul său pentru WIA sau, în cazul unei vulnerabilități într-un tip de WSCD sau keystore, intrarea din Status List pentru acea stocare. Un PID Provider verifică cel puțin o dată la 24 de ore starea WIA-ului și a Key Attestation din spatele fiecărui PID emis și revocă PID-ul atunci când oricare dintre ele este revocat. Attestation Providers pot proceda la fel. Nu expirarea WUA în sine scoate portofelul din ecosistem, ci revocarea acreditărilor emise pentru acesta.

Poate o singură Key Attestation să acopere mai multe chei?

Da. attested_keys poate lista mai multe chei publice din același WSCD sau keystore, iar așa funcționează emiterea în lot: emitentul leagă fiecare acreditare din lot de o cheie diferită, iar o singură semnătură a furnizorului de portofel le acoperă pe toate. Când Key Attestation este transmisă într-o jwt proof, unitatea de portofel semnează acea proof doar cu prima cheie din listă.

Surse

  1. TS3: Wallet Unit Attestations folosite la emiterea PID și a atestărilor
  2. EUDI Wallet Architecture and Reference Framework
  3. OpenID for Verifiable Credential Issuance 1.0
  4. OpenID4VC High Assurance Interoperability Profile 1.0
  5. OAuth 2.0 Attestation-Based Client Authentication
  6. Token Status List

Această pagină are caracter informativ și nu constituie consultanță juridică. Pentru îndrumări oficiale, consultați direct Comisia Europeană și OpenID Foundation.

Discutați cu noi despre integrarea EUDI Wallet