Izdaja poverilnic OpenID4VCI pojasnjena: od ponudbe do sprejete poverilnice
OpenID4VCI, OpenID for Verifiable Credential Issuance, določa, kako denarnica zahteva in prejme poverilnico od izdajatelja. Ena sama izdaja poteka skozi več različnih korakov, preden denarnica dejansko pridobi uporabno poverilnico, vsak od njih pa ima svoj način neuspeha. Ta stran v celoti opiše ta življenjski cikel, z izvirnimi praktičnimi primeri.
Dva načina začetka: predhodno avtorizirana koda in avtorizacijska koda
Izdaja se pogosto začne s Credential Offer, ki jo pošlje izdajatelj, grant, ki ga ta navaja, pa odloči, kako bo denarnica avtorizirana. Denarnica lahko izdajo začne tudi sama, brez kakršne koli ponudbe, s tokom avtorizacijske kode. Oba toka se končata na istem mestu: denarnica ima dostopni žeton, ki ga lahko uporabi za zahtevo poverilnice.
Tok s predhodno avtorizirano kodo
1. Izdajatelj
Že pozna imetnika, izda Credential Offer s pre-authorized_code
2. Denarnica
Unovči kodo na tokenski končni točki, po možnosti s transakcijsko kodo
3. Denarnica
Zahteva poverilnico z dokazilom o posesti svojega ključa
Tok z avtorizacijsko kodo
1. Denarnica
Skenira Credential Offer, ki navaja grant authorization_code, ali sama začne tok brez ponudbe
2. Avtorizacijski strežnik
Imetnika popelje skozi prijavo in privolitev, nato izda kodo
3. Denarnica
Kodo zamenja za token, nato zahteva poverilnico
Celoten življenjski cikel ponudbe poverilnice
Specifikacija ne določa poimenovanih stanj, vendar je tok, ki ga sproži izdajatelj in pri katerem je poverilnica izdana takoj, najlažje slediti kot spodnje zaporedje. Vsak korak lahko spodleti na svoj način, izvedba denarnice pa mora obravnavati tudi te poti, ne le uspešne.
Praktični primer: potrdilo o tehnični brezhibnosti za prevozniško floto
Organ za tehnične preglede vozil po rednem pregledu izda potrdilo o tehnični brezhibnosti v poslovno denarnico prevozniškega podjetja. Inšpektor je vodjo voznega parka že avtenticiral na mestu pregleda, zato izdajatelj uporabi tok s predhodno avtorizirano kodo. Spodnji koraki sledijo tej posamezni izdaji, od ponudbe do sprejete poverilnice.
Primer prikazuje osnovni OpenID4VCI. Uvedbe z visoko stopnjo zaupanja, kot je EUDI Wallet, na njem gradijo profil HAIP, ki doda dostopne žetone, vezane na DPoP, atestacijo denarnice na tokenski končni točki in atestacijo ključev za ključe poverilnic. Ti so tu izpuščeni, da ostane vsak korak razumljiv.
1. Ponudba poverilnice
Terminal organa za tehnične preglede prikaže kodo QR. Ta vsebuje URI, ki se začne z openid-credential-offer:// in prenaša spodnjo ponudbo, kodirano v URL v parametru credential_offer, ali credential_offer_uri, iz katerega jo denarnica pridobi. Denarnica kodo skenira in prebere, katera poverilnica je ponujena in kako jo pridobiti.
Izdajatelj
Prikaže kodo QR s Credential Offer
Navede konfiguracijo poverilnice in grant pre-authorized_code
{
"credential_issuer": "https://issuer.fleetinspect.example",
"credential_configuration_ids": ["roadworthiness_certificate"],
"grants": {
"urn:ietf:params:oauth:grant-type:pre-authorized_code": {
"pre-authorized_code": "fi-8f2c0b3a",
"tx_code": {
"length": 6,
"input_mode": "numeric",
"description": "Enter the code sent to your phone by text message"
}
}
}
}2. Odkrivanje metapodatkov izdajatelja
Preden karkoli zahteva, denarnica pridobi metapodatke izdajatelja, da izve, kaj vsebuje roadworthiness_certificate in katere končne točke naj kliče. Metapodatki ne navajajo ločenih avtorizacijskih strežnikov, zato je izdajatelj svoj lasten avtorizacijski strežnik, denarnica pa tokensko končno točko prebere iz metapodatkov tega strežnika.
Denarnica
GET /.well-known/openid-credential-issuer
Izve format poverilnice, trditve in sprejete vrste dokazil, poleg tega pa še končne točke za nonce, poverilnice, odlog in obvestila
Metapodatki izdajatelja poverilnic (izvleček)
{
"credential_issuer": "https://issuer.fleetinspect.example",
"nonce_endpoint": "https://issuer.fleetinspect.example/nonce",
"credential_endpoint": "https://issuer.fleetinspect.example/credential",
"deferred_credential_endpoint": "https://issuer.fleetinspect.example/deferred",
"notification_endpoint": "https://issuer.fleetinspect.example/notify",
"credential_configurations_supported": {
"roadworthiness_certificate": {
"format": "dc+sd-jwt",
"vct": "https://fleetinspect.example/vct/roadworthiness",
"cryptographic_binding_methods_supported": ["jwk"],
"credential_signing_alg_values_supported": ["ES256"],
"proof_types_supported": {
"jwt": { "proof_signing_alg_values_supported": ["ES256"] }
},
"credential_metadata": {
"claims": [
{ "path": ["vehicle_registration"] },
{ "path": ["inspection_result"] },
{ "path": ["valid_until"] }
]
}
}
}
}Metapodatki avtorizacijskega strežnika (izvleček), z /.well-known/oauth-authorization-server
{
"issuer": "https://issuer.fleetinspect.example",
"token_endpoint": "https://issuer.fleetinspect.example/token",
"pre-authorized_grant_anonymous_access_supported": true
}3. Zahteva za token
Denarnica unovči predhodno avtorizirano kodo na tokenski končni točki skupaj s transakcijsko kodo, ki jo je organ za tehnične preglede poslal na telefon vodje voznega parka. Pošiljanje te kode po drugem kanalu pomeni, da nekdo, ki kodo QR fotografira preko rame, je še vedno ne more unovčiti.
Denarnica
POST /token
Pošlje pre-authorized_code in tx_code, prejme dostopni žeton, omejen na to ponudbo
POST /token HTTP/1.1 Host: issuer.fleetinspect.example Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:pre-authorized_code &pre-authorized_code=fi-8f2c0b3a &tx_code=482913
Odgovor
{
"access_token": "fi-at-3d91e0",
"token_type": "Bearer",
"expires_in": 86400
}4. Dokazilo o posesti
Ker metapodatki navajajo nonce_endpoint, denarnica od tam najprej pridobi svež c_nonce. Nato dokaže, da ima zasebni ključ, na katerega bo poverilnica vezana, tako da podpiše proof JWT čez identifikator izdajatelja in ta c_nonce.
Denarnica
POST /nonce, nato podpiše proof JWT s ključem, na katerega bo poverilnica vezana
Poverilnico veže na ta ključ, ne le na tistega, ki ima dostopni žeton
POST /nonce HTTP/1.1 Host: issuer.fleetinspect.example
Odgovor
{
"c_nonce": "fi-nonce-77aa"
}Denarnica zdaj sestavi proof JWT iz dveh objektov JSON, glave in vsebine, ter ju podpiše z zasebnim ključem, na katerega bo poverilnica vezana.
Glava: kaj ta JWT je in kateri ključ ga je podpisal
{
"typ": "openid4vci-proof+jwt",
"alg": "ES256",
"jwk": { "kty": "EC", "crv": "P-256", "x": "...", "y": "..." }
}typ: označi to kot dokazilo ključa OpenID4VCI, tako da ga ni mogoče zamenjati z drugo vrsto JWTalg: algoritem podpisovanja, eden od tistih, ki jih je izdajatelj navedel v proof_signing_alg_values_supportedjwk: javni ključ, na katerega bo poverilnica vezana; izdajatelj glede na njega preveri podpis
Vsebina: za koga je dokazilo namenjeno in kdaj je nastalo
{
"aud": "https://issuer.fleetinspect.example",
"iat": 1789376400,
"nonce": "fi-nonce-77aa"
}aud: identifikator izdajatelja, zaradi česar dokazila ni mogoče ponovno uporabiti pri drugem izdajateljuiat: čas nastanka dokazila, v sekundah od leta 1970nonce: c_nonce iz nonce končne točke, ki pokaže, da je dokazilo sveže
Podpisan rezultat
Glava in vsebina sta vsaka kodirani v base64url in povezani s piko. Denarnica ta niz podpiše s svojim zasebnim ključem in za drugo piko doda podpis, kodiran v base64url. Nastali niz je proof JWT, ki ga denarnica pošlje v zahtevi za poverilnico v koraku 5.
base64url(header) . base64url(payload) . base64url(signature) eyJ0eXAiOiJvcGVuaWQ0dmNpLXByb29mK2p3dCIs... .eyJhdWQiOiJodHRwczovL2lzc3Vlci5mbGVldGluc3BlY3QuZXhhbXBsZSIs... .<ES256 signature>
5. Zahteva za poverilnico
Denarnica pokliče končno točko za poverilnice z dostopnim žetonom in dokazilom, izdajatelj pa ustvari in vrne podpisano poverilnico.
Denarnica
POST /credential
Pošlje dostopni žeton, identifikator konfiguracije in proof JWT, prejme podpisano poverilnico in notification_id
POST /credential HTTP/1.1
Host: issuer.fleetinspect.example
Content-Type: application/json
Authorization: Bearer fi-at-3d91e0
{
"credential_configuration_id": "roadworthiness_certificate",
"proofs": {
"jwt": ["<proof JWT from step 4>"]
}
}Odgovor
{
"credentials": [
{ "credential": "<issuer-signed SD-JWT VC>" }
],
"notification_id": "fi-notif-9012"
}Celoten potek na kratko
Ta diagram zaporedja združuje pet korakov praktičnega primera, od ponudbe do obvestila. Polne puščice so zahteve, črtkane puščice so odgovori, pikčasta puščica pa je transakcijska koda, ki potuje zunaj protokola z besedilnim sporočilom.
Denarnica
Poslovna denarnica prevozniškega podjetja
Avtorizacijski strežnik
V tem primeru jo upravlja kar izdajatelj sam
Izdajatelj poverilnic
Organ za tehnične preglede vozil
- Izdajatelj poverilnic komu Denarnica: Credential Offer, prikazana kot koda QR
- Izdajatelj poverilnic komu Denarnica: tx_code, poslan z besedilnim sporočilom na telefon vodje voznega parka
- Denarnica komu Izdajatelj poverilnic: GET /.well-known/openid-credential-issuer
- Izdajatelj poverilnic komu Denarnica: metapodatki izdajatelja poverilnic
- Denarnica komu Avtorizacijski strežnik: GET /.well-known/oauth-authorization-server
- Avtorizacijski strežnik komu Denarnica: metapodatki avtorizacijskega strežnika
- Denarnica komu Avtorizacijski strežnik: POST /token: pre-authorized_code, tx_code
- Avtorizacijski strežnik komu Denarnica: access_token
- Denarnica komu Izdajatelj poverilnic: POST /nonce
- Izdajatelj poverilnic komu Denarnica: c_nonce
- Denarnica: podpiše proof JWT
- Denarnica komu Izdajatelj poverilnic: POST /credential: dostopni žeton, dokazila
- Izdajatelj poverilnic komu Denarnica: credentials, notification_id
- Denarnica: preveri in shrani
- Denarnica komu Izdajatelj poverilnic: POST /notify: credential_accepted
- Izdajatelj poverilnic komu Denarnica: 204 No Content
Ko poverilnica še ni pripravljena: odložena izdaja
Zgornji primer predpostavlja, da je rezultat pregleda že dokončen. Če mora organ za tehnične preglede namesto tega mejni rezultat eskalirati k starejšemu inšpektorju, končna točka za poverilnice poverilnice ne more vrniti takoj, zato izdajo odloži.
Takojšnja izdaja
Končna točka za poverilnice vrne podpisano poverilnico v istem odgovoru kot zahtevo.
Odložena izdaja
Končna točka za poverilnice namesto poverilnice odgovori s HTTP 202, vrednostjo transaction_id in intervalom. Denarnica poizveduje deferred_credential_endpoint s tem ID-jem in med zahtevami čaka vsaj toliko sekund, kot določa interval, dokler poverilnica ni pripravljena.
Odložen odgovor iz /credential
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"transaction_id": "fi-tx-55c2",
"interval": 900
}Poizvedovanje /deferred, dokler ni pripravljeno
POST /deferred HTTP/1.1
Host: issuer.fleetinspect.example
Content-Type: application/json
Authorization: Bearer fi-at-3d91e0
{ "transaction_id": "fi-tx-55c2" }
// While the review is open: 202 with the same transaction_id and interval.
// Once approved: 200 with the credentials, optionally with a notification_id.
// If the review rejects the result: a credential_request_denied error.Zapiranje kroga: obvestilna končna točka
Po izdaji lahko denarnica izdajatelju sporoči, kaj se je zgodilo s poverilnico, z uporabo notification_id iz odgovora na poverilnico. Denarnice teh obvestil niso dolžne pošiljati, dostava pa ni zagotovljena, zato izdajatelj manjkajočega obvestila ne sme razlagati na noben način.
Denarnica
Pošlje dogodek na notification_endpoint izdajatelja za prejeti notification_id, ki zajema vsako poverilnico v tem odgovoru
Shranjeno v denarnici
Izdaja ni uspela iz drugega razloga, na primer poverilnica ni prestala validacije
Izdaja ni uspela zaradi imetnika, na primer je zavrnil shranitev poverilnice
POST /notify HTTP/1.1
Host: issuer.fleetinspect.example
Content-Type: application/json
Authorization: Bearer fi-at-3d91e0
{
"notification_id": "fi-notif-9012",
"event": "credential_accepted"
}Sorodni pojmi
Pogosta vprašanja
Kako denarnica ve, katero vrsto granta naj uporabi?
Credential Offer navede grant v svojem objektu grants. authorization_code je prisoten, kadar izdajatelj želi, da se imetnik v okviru poteka prijavi. pre-authorized_code je prisoten, kadar je bil imetnik že avtenticiran na kanalu, na katerem je bila ponudba ustvarjena, na primer s strani inšpektorja na mestu pregleda v spodnjem praktičnem primeru. Ponudba lahko navaja oba, denarnica pa nato izbere enega. Če ponudba sploh nima objekta grants, denarnica v metapodatkih preveri, katere vrste grantov podpira avtorizacijski strežnik.
Zakaj denarnica pridobi metapodatke izdajatelja, preden karkoli zahteva?
Credential Offer navaja le credential_configuration_ids, URL izdajatelja in grants. Metapodatki izdajatelja, ki so na voljo na dobro znani poti, opisujejo vsako konfiguracijo: njen format, trditve in sprejete vrste dokazil, poleg tega pa še končne točke za nonce, poverilnice, odlog in obvestila. Prav tako povedo, kateri avtorizacijski strežnik uporabiti, metapodatki tega strežnika pa podajo tokensko končno točko. Brez obojega denarnica ne bi vedela, kako sestaviti veljavne zahteve niti kaj pokazati imetniku, preden ta poda privolitev.
Kaj dokazilo o posesti dejansko dokazuje?
Dokazuje, da ima denarnica, ki zahteva poverilnico, zasebni ključ, na katerega bo poverilnica vezana, ne le da ima veljaven dostopni žeton. Denarnica s tem ključem podpiše proof JWT čez identifikator izdajatelja in svež c_nonce iz nonce končne točke izdajatelja. Izdajatelj ustrezni javni ključ vloži v poverilnico. Preveritelj, ki zahteva vezavo na ključ, ob predložitvi zaprosi imetnika, naj znova podpiše z istim ključem, tako da kopirana poverilnica brez ključa te preveritve ne prestane.
Zakaj bi izdajatelj odložil izdajo, namesto da poverilnico vrne takoj?
Nekatera preverjanja, ki jih izdajatelj izvede pred ustvarjanjem poverilnice, se ne morejo zaključiti znotraj ene same zahteve HTTP, na primer ročni pregled ali klic počasnega zunanjega registra. Odložena izdaja omogoča, da končna točka za poverilnice takoj odgovori z vrednostjo transaction_id, namesto da blokira povezavo, denarnica pa poizveduje odloženo končno točko s tem ID-jem, dokler se preverjanje ne konča in poverilnica ni pripravljena za prevzem.
Ali mora izdajatelj obvezno implementirati obvestilno končno točko?
Ne. Za izdajatelje je neobvezna, prav tako je denarnice niso dolžne uporabljati. Kadar jo podpirata obe strani, izdajatelj izve, kaj se je zgodilo po izdaji: poverilnice so bile shranjene (credential_accepted), imetnik je izdajo prekinil, na primer z zavrnitvijo shranitve (credential_deleted), ali pa je izdaja spodletela iz drugega razloga (credential_failure). Dostava ni zagotovljena, zato naj izdajatelj obvestilo obravnava kot koristno informacijo, nikoli kot zanesljiv zapis, in iz manjkajočega obvestila ne sme sklepati ničesar.
Viri
Ta stran je informativne narave in ne predstavlja pravnega nasveta. Za verodostojne napotke se obrnite neposredno na OpenID Foundation in Evropsko komisijo.