Ugrás a fő tartalomra

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.

Ajánlat létrehozva
A QR-kód vagy a link megnyitja a tárcát
Ajánlat fogadva
a jogosultság beváltva
Token megszerezve
nonce és a birtoklás bizonyítása
Hitelesítő okirat igényelve
a hitelesítő okirat kiállítva
Hitelesítő okirat kibocsátva
a tárca ellenőriz és tárol
Hitelesítő okirat elfogadva
Hol hiúsulhat meg a folyamat, a lépések sorrendjében:
A kód lejárt a beváltás előtt
A tokenkérés elutasítva
A hitelesítőokirat-kérés elutasítva
A hitelesítő okirat nem került tárolásra

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-vel
  • alg: az aláíró algoritmus, amelyet a kibocsátó a proof_signing_alg_values_supported listában sorolt fel
  • jwk: 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ál
  • iat: a bizonyíték létrehozásának időpontja, 1970 óta eltelt másodpercekben
  • nonce: 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

  1. Hitelesítőokirat-kibocsátó ide Tárca: Credential Offer, QR-kódként megjelenítve
  2. Hitelesítőokirat-kibocsátó ide Tárca: tx_code, SMS-ben elküldve a flottavezető telefonjára
  3. Tárca ide Hitelesítőokirat-kibocsátó: GET /.well-known/openid-credential-issuer
  4. Hitelesítőokirat-kibocsátó ide Tárca: hitelesítőokirat-kibocsátói metaadatok
  5. Tárca ide Engedélyezési szerver: GET /.well-known/oauth-authorization-server
  6. Engedélyezési szerver ide Tárca: engedélyezési szerver metaadatai
  7. Tárca ide Engedélyezési szerver: POST /token: pre-authorized_code, tx_code
  8. Engedélyezési szerver ide Tárca: access_token
  9. Tárca ide Hitelesítőokirat-kibocsátó: POST /nonce
  10. Hitelesítőokirat-kibocsátó ide Tárca: c_nonce
  11. Tárca: aláírja a proof JWT-t
  12. Tárca ide Hitelesítőokirat-kibocsátó: POST /credential: hozzáférési token, bizonyítékok
  13. Hitelesítőokirat-kibocsátó ide Tárca: credentials, notification_id
  14. Tárca: ellenőriz és tárol
  15. Tárca ide Hitelesítőokirat-kibocsátó: POST /notify: credential_accepted
  16. 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.

transaction_ida deferred_credential_endpoint lekérdezése

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

credential_accepted

Eltárolva a tárcában

credential_failure

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

credential_deleted

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

  1. OpenID for Verifiable Credential Issuance 1.0
  2. OpenID4VC High Assurance Interoperability Profile 1.0
  3. EUDI Wallet Architecture and Reference Framework

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.

Beszéljen velünk az EUDI Wallet integrációról