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
2. WSCD sau keystore
Returnează cheile publice, împreună cu dovezi de la platformă despre locul în care au fost generate
3. Furnizor de portofel
Verifică integritatea aplicației și dovezile privind cheile, apoi semnează WIA-uri și Key Attestations
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âmp | Ce îi spune emitentului |
|---|---|
| typ / x5c | Că este un client attestation, și lanțul de certificate al furnizorului de portofel, de verificat în raport cu Trusted List |
| sub | Tipul de portofel, același pentru fiecare instalare, astfel încât nu poate fi folosit pentru a urmări un utilizator |
| wallet_name / wallet_version | Wallet Solution așa cum apare în Trusted List, și versiunea acesteia |
| wallet_solution_certification_information | Cine a certificat Wallet Solution; conținutul exact nu a fost încă definit |
| exp | Expirarea tehnică, la mai puțin de 24 de ore după verificarea integrității |
| client_status | O intrare din Status List pentru această Wallet Instance și data până la care furnizorul de portofel o ține la zi |
| cnf | Cheia 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âmp | Ce îi spune emitentului |
|---|---|
| typ / x5c | Că este o key attestation, și lanțul de certificate al furnizorului de portofel, de verificat în raport cu Trusted List |
| iat / exp | Când a fost emisă și când expiră din punct de vedere tehnic |
| attested_keys | Chei 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_authentication | Cât de bine rezistă la atacuri stocarea și autentificarea utilizatorului care deblochează cheile; un WSCD este întotdeauna iso_18045_high pentru ambele |
| certification | Certificarea WSCD-ului sau keystore-ului, din care emitentul își poate da seama dacă este un WSCD |
| key_storage_status | O intrare din Status List pentru WSCD sau keystore și data până la care furnizorul de portofel o ține la zi |
| nonce | c_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
- 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
- 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.
| Termen | Ce acoperă | Cine o primește |
|---|---|---|
| WUA | Termen generic pentru cele două atestări de mai jos | PID Providers și Attestation Providers, doar în timpul emiterii |
| WIA | Wallet Instance, adică aplicația | Authorization Server, în Pushed Authorization Request și Token Request |
| KA | Un 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
Această pagină are caracter informativ și nu constituie consultanță juridică. Pentru îndrumări oficiale, consultați direct Comisia Europeană și OpenID Foundation.