Skapa en utfärdartjänst

Kom igång med att skapa en utfärdartjänst för biljettintyg.

Om biljettintyg

Biljettintygets dataobjekt ska göras så kompakt som möjligt för optisk transport, exempelvis i en QR kod. CBOR (Concise Binary Object Representation) är ett binärt dataformat som används för
att representera data på ett kompakt och effektivt sätt och är baserat på JSON.

Biljettintyg ska struktureras och kodas som en CBOR med en digital COSE signatur med hjälp av ett asymmetriskt signaturschema enligt COSE specifikationen (RFC 8152) för att en Verifierare ska kunna kontrollera biljettens äkthet och integritet. Detta kallas tillsammans för CBOR Web token (CWT) och definieras i RFC 8392. CWTs är en profil av JSON Web tokens (JWTs) som är optimerade för begränsade enheter.

Följande instruktion är en vägledning för dig inom offentlig förvaltning om hur man skapar ett biljettintyg baserat på Hcert specifikationens krav och principer. Detaljerad info och grafiska beskrivningar finns i referensarkitketuren för biljettintyg.

CWT struktur

Biljettintygets innehåll transporteras i CWT "claims" som defineras efter behov. Engelskans "claim" kan översättas till fält, men båda definitioner används löpande i denna text. Intygets payload claims, header claims och signaturen utgör CWT biljetten. I Figuren nedan presenteras CWT strukturen för ett Covidbevis (Hcert). Mer info om claims finns i referensarkitekturen eller i RFC 8392.

För Covidbevis registrerades en publik claim hcert med claim key -260, som kan återanvändas för andra hälsointyg. Hcert är ett JSON-objekt (RFC 7159) som innehåller information om intyget.
Strängar i JSON objektet bör vara NFC normaliserade enligt Unicode-standarden.

Protected header

  • Signature Algorithm (alg, label 1)
  • Key Identifier (kid, label 4)

Payload

  • Issuer (iss, claim key 1)
  • Issued At (iat, claim key 6)
  • Expiration Time (exp, claim key 4)
  • Health certificate (hcert, claim key -260)

Signature

Komma igång

Utfärdartjänsten ska hämta informationen som behövs för intyget och skapa en CBOR web token som är digitalt signerad genom COSE och representeras i en 2D kod.

Flöde för att generera 2D koden

JSON->CBOR->COSE->Zlib->Base45 + 2D kod

1: Skapa JSON dokument

Intygets information aggregeras ihop och skapas i JSON format.

Exempel JSON dokument av ett Covidbevis, se även eu-dcc-schema: Länk till annan webbplats.

{
"ver": "1.3.0",
"nam": {
"fn": "Lövström",
"fnt": "LOEVSTROEM",
"gn": "Oscar",
"gnt": "OSCAR"
},
"dob": "1958-11-11",
"v": [
{
"tg": "840539006",
"vp": "J07BX03",
"mp": "EU/1/21/1529",
"ma": "ORG-100030215",
"dn": 2,
"sd": 2,
"dt": "2021-05-18",
"co": "SE",
"is": "Swedish eHealth Agency",
"ci": "
}

2: CBOR

Intygets JSON dokument och övriga metadata sätts samman i ett set av CBOR Webtoken claims och kodas om till binär form.

3: COSE signering

COSE (CBOR Object Signing and Encryption) är en understandard till CBOR som tillhandahåller stöd för digital signering av CBOR-objekt. Signering utförs för att en Verifierare ska kunna säkerställa att CWT token är autentisk och inte har manipulerats. För att skapa en digital signatur behövs ett DSC certifikat och motsvarande privata nyckel.

4: Komprimera

För att minska storleken och förbättra hastigheten och tillförlitligheten vid läsning av 2D koden skall CWT:en komprimeras.

5: Generera Base45 + 2D kod

Base45 encoding används för att generera 2D koder eftersom den är en effektiv och robust metod för att representera binära data i en ASCII baserad sträng. Den använder en 45 teckens alfabet som består av siffror, bokstäver och ett par symboler. Detta gör att den kan representera data i en mindre mängd utrymme än andra kodningsmetoder.

Man kan lägga till ett prefix för att identifiera den alfanumeriska koden, exempelvis HC1 (Health Certificate 1). Detta gör att verifierare kan kunna upptäcka vilken typ av data som kodats och välja rätt avkodnings och bearbetningsschema, när det finns behov av att verifiera olika typer av intyg.

Referensprojekt

Det finns ett Java bibliotek som DIGG tagit fram för Covidbeviset som ligger på Github. Biblioteket användes för att skapa, signera och generera QR kod baserat på Hcert flödet.

DGC Java

Det finns liknande implementationer för C#, Python på eHealthnetworks Github. Detta är dock inte något som är testat av varken DIGG eller eHälsomyndigheten.

Bygga en utfärdartjänst

Steg 1 - Skapa projektet för utfärdartjänsten

  • Gör en fork av DGC Java
  • Testa att skapa, signera och generera en QR kod
  • Refaktorera kod för nya intyget

Steg - 2 Lägg på fler funktioner

  • Design av intyget (PDF mall)
  • Persistering mot databad
  • Hämtning av grunddata
  • Användargränssnitt
  • Distribution mot digital brevlåda
Hjälpte denna information dig?

Ditt svar hjälper oss att förbättra sidan

Senast uppdaterad: