Az OpenID4VCI hitelesítőokirat-kibocsátás magyarázata: az ajánlattól az elfogadott hitelesítő okiratig
Az OpenID4VCI, azaz OpenID for Verifiable Credential Issuance, meghatározza, hogyan igényel és kap egy tárca hitelesítő okiratot egy kibocsátótól. Egyetlen kibocsátás több különálló lépésen megy keresztül, mielőtt a tárca ténylegesen használható hitelesítő okirathoz jut, és mindegyiknek megvan a saját hibázási módja. Ez az oldal végigvezet ezen az életcikluson, eredeti kidolgozott példákkal.
Két indulási mód: előre engedélyezett kód és engedélyezési kód
A kibocsátás gyakran a kibocsátó által küldött Credential Offer ajánlattal indul, és az abban megnevezett jogosultság dönti el, hogyan kap a tárca engedélyt. A tárca ajánlat nélkül is elindíthatja maga a kibocsátást, az engedélyezési kód folyamattal. Mindkét folyamat ugyanoda vezet: a tárca birtokába kerül egy hozzáférési tokennek, amellyel igényelheti a hitelesítő okiratot.
Előre engedélyezett kód folyamat
1. Kibocsátó
Már ismeri a birtokost, és kiad egy Credential Offer ajánlatot egy pre-authorized_code kóddal
2. Tárca
Beváltja a kódot a token végponton, opcionálisan egy tranzakciós kóddal
3. Tárca
Igényli a hitelesítő okiratot a kulcsa birtoklásának bizonyításával
Engedélyezési kód folyamat
1. Tárca
Beolvas egy Credential Offer ajánlatot, amely egy authorization_code jogosultságot nevez meg, vagy ajánlat nélkül maga indítja el a folyamatot
2. Engedélyezési szerver
Végigvezeti a birtokost a bejelentkezésen és a hozzájáruláson, majd kiad egy kódot
3. Tárca
Beváltja a kódot tokenre, majd igényli a hitelesítő okiratot
Egy hitelesítőokirat-ajánlat teljes életciklusa
A specifikáció nem definiál elnevezett állapotokat, de egy kibocsátó által kezdeményezett folyamatot, amelyben a hitelesítő okiratot azonnal kiadják, a legkönnyebb az alábbi sorrendben követni. Minden lépés a maga módján hiúsulhat meg, és egy tárca-implementációnak ezeket az útvonalakat is kezelnie kell, nem csak a sikeres esetet.
Kidolgozott példa: forgalmi alkalmassági bizonyítvány egy fuvarozó flottának
Egy járműműszaki vizsgáztató szerv forgalmi alkalmassági bizonyítványt bocsát ki egy fuvarozó vállalat üzleti tárcájának egy rutinvizsgálat után. A vizsgabiztos már hitelesítette a flottavezetőt a vizsgálóállomáson, ezért a kibocsátó az előre engedélyezett kód folyamatot használja. Az alábbi lépések ezt az egyetlen kibocsátást követik az ajánlattól az elfogadott hitelesítő okiratig.
A példa az alap OpenID4VCI-t mutatja be. A magas biztonsági szintű megvalósítások, mint az EUDI Wallet, erre építve a HAIP profilt követik, amely DPoP-hoz kötött hozzáférési tokeneket, tárca-attesztációt ad hozzá a token végponton, valamint kulcs-attesztációt a hitelesítőokirat-kulcsokhoz. Ezeket itt kihagytuk, hogy minden lépés jól olvasható maradjon.
1. Hitelesítőokirat-ajánlat
A vizsgáztató szerv terminálja egy QR-kódot mutat. Egy openid-credential-offer:// kezdetű URI-t tartalmaz, amely az alábbi ajánlatot hordozza, URL-kódolva egy credential_offer paraméterben, vagy egy credential_offer_uri címet, ahonnan a tárca lekéri azt. A tárca beolvassa, és leolvassa, melyik hitelesítő okirat áll rendelkezésre, és hogyan szerezhető meg.
Kibocsátó
QR-kódot mutat egy Credential Offer ajánlattal
Megnevezi a hitelesítőokirat-konfigurációt és egy pre-authorized_code jogosultságot
{
"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. Kibocsátói metaadatok felderítése
Mielőtt bármit kérne, a tárca lekéri a kibocsátó metaadatait, hogy megtudja, mit tartalmaz a roadworthiness_certificate, és mely végpontokat kell hívnia. A metaadat nem sorol fel külön engedélyezési szervert, tehát a kibocsátó a saját engedélyezési szervere, és a tárca ennek a szervernek a metaadataiból olvassa ki a token végpontot.
Tárca
GET /.well-known/openid-credential-issuer
Megismeri a hitelesítőokirat formátumát, igényléseit és az elfogadott bizonyítéktípusokat, valamint a nonce, a hitelesítő okirat, a halasztott és az értesítési végpontokat
Hitelesítőokirat-kibocsátói metaadatok (részlet)
{
"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"] }
]
}
}
}
}Engedélyezési szerver metaadatai (részlet), a /.well-known/oauth-authorization-server végpontról
{
"issuer": "https://issuer.fleetinspect.example",
"token_endpoint": "https://issuer.fleetinspect.example/token",
"pre-authorized_grant_anonymous_access_supported": true
}3. Tokenkérés
A tárca beváltja az előre engedélyezett kódot a token végponton, együtt a vizsgáztató szerv által a flottavezető telefonjára küldött tranzakciós kóddal. Az, hogy ez a kód egy második csatornán érkezik, azt jelenti, hogy aki a válla fölött lefényképezi a QR-kódot, még mindig nem tudja beváltani azt.
Tárca
POST /token
Elküldi a pre-authorized_code és tx_code értékeket, és cserébe egy erre az ajánlatra korlátozott hozzáférési tokent kap
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
Válasz
{
"access_token": "fi-at-3d91e0",
"token_type": "Bearer",
"expires_in": 86400
}4. A birtoklás bizonyítása
Mivel a metaadat felsorol egy nonce_endpoint végpontot, a tárca először egy friss c_nonce-t kér onnan. Ezután bizonyítja, hogy birtokolja azt a privát kulcsot, amelyhez a hitelesítő okiratot kötik, azáltal, hogy aláír egy proof JWT-t a kibocsátó azonosítója és ez a c_nonce felett.
Tárca
POST /nonce, majd aláír egy proof JWT-t azzal a kulccsal, amelyhez a hitelesítő okiratot kötik
A hitelesítő okiratot ehhez a kulcshoz köti, nem csupán ahhoz, aki birtokolja a hozzáférési tokent
POST /nonce HTTP/1.1 Host: issuer.fleetinspect.example
Válasz
{
"c_nonce": "fi-nonce-77aa"
}A tárca ezután két JSON objektumból, egy fejlécből és egy hasznos adatból építi fel a proof JWT-t, és aláírja azokat azzal a privát kulccsal, amelyhez a hitelesítő okiratot kötik.
Fejléc: mi ez a JWT, és melyik kulcs írta alá
{
"typ": "openid4vci-proof+jwt",
"alg": "ES256",
"jwk": { "kty": "EC", "crv": "P-256", "x": "...", "y": "..." }
}typ: megjelöli, hogy ez egy OpenID4VCI kulcsbizonyíték, így nem téveszthető össze más típusú JWT-velalg: az aláíró algoritmus, amelyet a kibocsátó a proof_signing_alg_values_supported listában sorolt feljwk: az a nyilvános kulcs, amelyhez a hitelesítő okiratot kötik; a kibocsátó ehhez ellenőrzi az aláírást
Hasznos adat: kinek szól a bizonyíték, és mikor készült
{
"aud": "https://issuer.fleetinspect.example",
"iat": 1789376400,
"nonce": "fi-nonce-77aa"
}aud: a kibocsátó azonosítója, így a bizonyíték nem játszható vissza egy másik kibocsátónáliat: a bizonyíték létrehozásának időpontja, 1970 óta eltelt másodpercekbennonce: a nonce végpontról származó c_nonce, amely mutatja, hogy a bizonyíték friss
Az aláírt eredmény
A fejlécet és a hasznos adatot külön-külön base64url-kódolják, majd egy ponttal összekapcsolják. A tárca ezt a karakterláncot aláírja a privát kulcsával, és a base64url-kódolt aláírást egy második pont után hozzáfűzi. A kapott karakterlánc lesz az a proof JWT, amelyet a tárca az 5. lépésben a hitelesítőokirat-kérésben küld el.
base64url(header) . base64url(payload) . base64url(signature) eyJ0eXAiOiJvcGVuaWQ0dmNpLXByb29mK2p3dCIs... .eyJhdWQiOiJodHRwczovL2lzc3Vlci5mbGVldGluc3BlY3QuZXhhbXBsZSIs... .<ES256 signature>
5. Hitelesítőokirat-kérés
A tárca meghívja a hitelesítőokirat-végpontot a hozzáférési tokennel és a bizonyítékkal, a kibocsátó pedig kiállítja és visszaadja az aláírt hitelesítő okiratot.
Tárca
POST /credential
Elküldi a hozzáférési tokent, a konfigurációazonosítót és a proof JWT-t, cserébe megkapja az aláírt hitelesítő okiratot és egy notification_id azonosítót
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>"]
}
}Válasz
{
"credentials": [
{ "credential": "<issuer-signed SD-JWT VC>" }
],
"notification_id": "fi-notif-9012"
}A teljes folyamat egy pillantásra
Ez a szekvenciadiagram egyben mutatja be a kidolgozott példa öt lépését, az ajánlattól az értesítésig. A folytonos nyilak kérések, a szaggatott nyilak válaszok, a pontozott nyíl pedig a protokollon kívül, SMS-ben utazó tranzakciós kódot jelöli.
Tárca
A fuvarozó vállalat üzleti tárcája
Engedélyezési szerver
Ebben a példában maga a kibocsátó üzemelteti
Hitelesítőokirat-kibocsátó
Járműműszaki vizsgáztató szerv
- Hitelesítőokirat-kibocsátó ide Tárca: Credential Offer, QR-kódként megjelenítve
- Hitelesítőokirat-kibocsátó ide Tárca: tx_code, SMS-ben elküldve a flottavezető telefonjára
- Tárca ide Hitelesítőokirat-kibocsátó: GET /.well-known/openid-credential-issuer
- Hitelesítőokirat-kibocsátó ide Tárca: hitelesítőokirat-kibocsátói metaadatok
- Tárca ide Engedélyezési szerver: GET /.well-known/oauth-authorization-server
- Engedélyezési szerver ide Tárca: engedélyezési szerver metaadatai
- Tárca ide Engedélyezési szerver: POST /token: pre-authorized_code, tx_code
- Engedélyezési szerver ide Tárca: access_token
- Tárca ide Hitelesítőokirat-kibocsátó: POST /nonce
- Hitelesítőokirat-kibocsátó ide Tárca: c_nonce
- Tárca: aláírja a proof JWT-t
- Tárca ide Hitelesítőokirat-kibocsátó: POST /credential: hozzáférési token, bizonyítékok
- Hitelesítőokirat-kibocsátó ide Tárca: credentials, notification_id
- Tárca: ellenőriz és tárol
- Tárca ide Hitelesítőokirat-kibocsátó: POST /notify: credential_accepted
- Hitelesítőokirat-kibocsátó ide Tárca: 204 No Content
Ha a hitelesítő okirat még nem áll készen: halasztott kibocsátás
A fenti példa azt feltételezi, hogy a vizsgálat eredménye már végleges. Ha a vizsgáztató szervnek ehelyett egy határeset eredményt egy vezető vizsgabiztoshoz kell eszkalálnia, a hitelesítőokirat-végpont nem tudja azonnal visszaadni a hitelesítő okiratot, ezért elhalasztja a kibocsátást.
Azonnali kibocsátás
A hitelesítőokirat-végpont ugyanabban a válaszban adja vissza az aláírt hitelesítő okiratot, mint amelyben a kérés érkezett.
Halasztott kibocsátás
A hitelesítőokirat-végpont HTTP 202 státusszal, egy transaction_id azonosítóval és egy intervallummal válaszol. A tárca ezzel az azonosítóval lekérdezi a halasztott hitelesítőokirat-végpontot, legalább az interval másodpercet várva a kérések között, amíg a hitelesítő okirat elkészül.
Halasztott válasz a /credential végpontról
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"transaction_id": "fi-tx-55c2",
"interval": 900
}A /deferred lekérdezése, amíg kész nem lesz
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.A kör lezárása: az értesítési végpont
A kibocsátás után a tárca tájékoztathatja a kibocsátót arról, mi történt a hitelesítő okirattal, a hitelesítőokirat-válaszból kapott notification_id azonosító felhasználásával. A tárcáknak nem kötelező elküldeniük ezeket az értesítéseket, és a kézbesítés nem garantált, ezért a kibocsátó nem tulajdoníthat jelentést egy hiányzó értesítésnek.
Tárca
Eseményt küld a kibocsátó notification_endpoint végpontjára a kapott notification_id azonosítóhoz, amely az adott válaszban szereplő összes hitelesítő okiratra vonatkozik
Eltárolva a tárcában
A kibocsátás bármely más okból meghiúsult, például a hitelesítő okirat nem ment át az ellenőrzésen
A kibocsátás a birtokos miatt hiúsult meg, például mert nem fogadta el a tárolását
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"
}Kapcsolódó fogalmak
Gyakran ismételt kérdések
Honnan tudja a tárca, melyik jogosultságtípust használja?
A Credential Offer a grants objektumában nevezi meg a jogosultságot. Az authorization_code akkor van jelen, ha a kibocsátó azt akarja, hogy a birtokos a folyamat részeként jelentkezzen be. A pre-authorized_code akkor van jelen, ha a birtokost már hitelesítették azon a csatornán, ahol az ajánlat létrejött, például az alábbi kidolgozott példában a vizsgabiztos a vizsgálóállomáson. Egy ajánlat mindkettőt felsorolhatja, és ekkor a tárca választ közülük. Ha az ajánlatnak egyáltalán nincs grants objektuma, a tárca az engedélyezési szerver metaadataiból nézi meg, mely jogosultságtípusokat támogatja.
Miért kéri le a tárca a kibocsátói metaadatokat, mielőtt bármit kérne?
A Credential Offer csak a credential_configuration_ids azonosítókat, a kibocsátó URL-jét és a grants objektumot nevezi meg. A kibocsátó egy jól ismert útvonalról kiszolgált metaadata írja le az egyes konfigurációkat: a formátumukat, az igényléseiket és az elfogadott bizonyítéktípusokat, valamint a nonce, a hitelesítő okirat, a halasztott és az értesítési végpontokat. Azt is megadja, melyik engedélyezési szervert kell használni, és annak metaadatai adják meg a token végpontot. E kettő nélkül a tárca nem tudná, hogyan állítson össze érvényes kéréseket, és mit mutasson a birtokosnak a hozzájárulás előtt.
Mit bizonyít valójában a birtoklás bizonyítása?
Azt bizonyítja, hogy a hitelesítő okiratot igénylő tárca birtokolja azt a privát kulcsot, amelyhez a hitelesítő okiratot kötik, nem csupán azt, hogy érvényes hozzáférési tokennel rendelkezik. A tárca ezzel a kulccsal aláír egy proof JWT-t a kibocsátó azonosítója és a kibocsátó nonce végpontjáról kapott friss c_nonce felett. A kibocsátó a megfelelő nyilvános kulcsot beágyazza a hitelesítő okiratba. Egy olyan ellenőr, aki kulcskötést követel meg, a bemutatáskor ismét ugyanazzal a kulccsal kéri az aláírást a birtokostól, így egy kulcs nélkül lemásolt hitelesítő okirat elbukik ezen az ellenőrzésen.
Miért halasztaná el a kibocsátó a kibocsátást ahelyett, hogy azonnal visszaadná a hitelesítő okiratot?
Egyes, a kibocsátó által a hitelesítő okirat kiállítása előtt végzett ellenőrzések nem fejezhetők be egyetlen HTTP-kérésen belül, például egy manuális felülvizsgálat vagy egy lassú külső nyilvántartás lekérdezése esetén. A halasztott kibocsátás lehetővé teszi, hogy a hitelesítőokirat-végpont azonnal egy transaction_id azonosítóval válaszoljon a kapcsolat blokkolása helyett, és a tárca ezzel az azonosítóval lekérdezi a halasztott végpontot, amíg az ellenőrzés befejeződik, és a hitelesítő okirat átvehetővé válik.
Kötelező-e a kibocsátónak megvalósítania az értesítési végpontot?
Nem. A kibocsátók számára opcionális, és a tárcáknak sem kötelező használniuk. Ha mindkét fél támogatja, a kibocsátó megtudja, mi történt a kibocsátás után: a hitelesítő okiratokat eltárolták (credential_accepted), a birtokos leállította a kibocsátást, például mert nem fogadta el a tárolásukat (credential_deleted), vagy más okból meghiúsult (credential_failure). A kézbesítés nem garantált, ezért a kibocsátónak az értesítést hasznos információként kell kezelnie, sosem megbízható nyilvántartásként, és a hiányzó értesítésből semmit sem szabad kikövetkeztetnie.
Források
Ez az oldal tájékoztató jellegű, és nem minősül jogi tanácsadásnak. Hiteles útmutatásért forduljon közvetlenül az OpenID Foundationhoz és az Európai Bizottsághoz.