Vorderingenoverzicht Rijk

Overheidsbrede Standaard
Werkversie

Laatst gepubliceerde versie:
https://vorijk.nl/standaard/
Vorige versie:
https://vorijk.nl/standaard/
Redacteur:
Team Vorderingenoverzicht Rijk (Centraal Justitieel Incasso Bureau)
Auteur:
Team Vorderingenoverzicht Rijk (Centraal Justitieel Incasso Bureau), Contact

Samenvatting

Het verzamelen van gegevens over actuele betalingsverplichtingen is voor burgers die in schuldhulpverlening terecht komen een grote drempel. Met het project Vorderingenoverzicht Rijk leveren we een bijdrage aan het verlagen van die drempel, zodat problemen met betalingen en schulden sneller kunnen worden opgelost of worden voorkomen. Het is daarom onze missie om burgers in staat te stellen gemakkelijk een overzicht van hun financiële verplichtingen aan overheidsorganisaties te verkrijgen, zodat zij hun eigen situatie kennen. Deze missie is samengevat in de volgende user story:

"Als burger wil ik een overzicht van mijn actuele betalingsverplichtingen aan overheidsorganisaties zien, zodat ik mijn situatie ken en op basis hiervan (direct) de noodzakelijke of gewenste acties kan ondernemen."

Op basis van een makkelijker en beter overzicht kan de burger als dat nodig is de noodzakelijke of gewenste acties ondernemen. Het overzicht vormt daarmee een belangrijk hulpmiddel voor burgers om meer grip te krijgen op hun financiële situatie en in actie te kunnen komen, eventueel samen met een hulpverlener. In andere gevallen kan het overzicht mensen het inzicht geven, dat er geen actuele risico's zijn. Het Vorderingenoverzicht is er in ieder geval voor iedereen, voor alle burgers van Nederland.

Toepassingsprofiel

⌛ nog niet beschikbaar: toepassingsprofiel

Status van dit document

Dit is een werkversie die op elk moment kan worden gewijzigd, verwijderd of vervangen door andere documenten. Het is geen goedgekeurde consultatieversie.

1. Introductie

Deze standaard beschrijft twee protocollen:

Beide protocollen maken gebruik van het CreateSession protocol uit de Blauwe Knop Connect standaard voor het authenticeren van de App naar de organisatie. Beide keren levert dat een sessionToken op, en een AES sleutel voor versleuteling van het verkeer tussen de App en organisatie. De App verstuurt het sessionToken mee met zijn berichten aan de organisatie, welke deze gebruikt om de relevante sessie-informatie op te zoeken wat is vastgesteld tijdens het CreateSession protocol. Daarbij is het van belang dat hij ook controleert dat de sessie inmiddels niet verlopen is, en dat de scope parameter de verwachte waarde heeft.

1.1 Cryptografie

De sectie over cryptografie uit de Blauwe Knop Connect standaard is ook van toepassing in deze standaard.

2. Specificaties

2.1 Documenten

De protocollen in deze standaard faciliteren het uitwisselen van al of niet digitaal ondertekende documenten tussen de app en de organisatie. Een Document is een in deze standaard gedefinieerde datastructuur, met daarin in elk geval de volgende velden:

Een Document MAG ondertekend worden, wat in dat geval in de vorm van een JWS MOET zijn, met "document" als de waarde van de sub parameter. De kid parameter MAG gebruikt worden in de JWS header en MOET indien aanwezig een string zijn.

Voorbeeld van een Document JWS (met newlines enkel voor leesbaarheid):

eyJ0eXAiOiJqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6IjEifQ.eyJzdWIiOiJkb2N1bWVudCIsInR5
cGUiOiJFWEFNUExFX0RPQ1VNRU5UX1RZUEUiLCJ2ZXJzaW9uIjoiMSIsImJvZHkiOnsiZm9vIjoiYmF
yIn19.EHcxxbaDLX0MkrJvlg6kQ3ENgmV9ndEYp5eaFF6MnHcumH_9mfMVCTJtxwf9zSdqtZ2gRMnKp
n-e9OPPaeiGdA

De inhoud van deze JWS (zie ook https://jwt.io) is als volgt (zie de Cryptografie sectie in de Blauwe Knop Connect standaard voor een uitleg van de hier gebruikte notatie):

{
  "typ": "jwt",
  "alg": "ES256",
  "kid": "1"
}
.
{
  "sub": "document",
  "type": "EXAMPLE_DOCUMENT_TYPE",
  "version": "1",
  "body": {
    "foo": "bar"
  }
}

Deze JWS kan geverifieerd worden met de volgende public key:

{
  "kty": "EC", "crv": "P-256",
  "x": "T5PP_Q1prhqQoBH5tgXkfrLGV5wrB8HuANJZezYP5m8",
  "y": "dtALK0t1e3dJXGyYgiyRrqONAQhi2LjFYYh9S5GqHyg"
}

2.2 Verzoek configureren: ConfigureRequest

In het ConfigureRequest protocol geeft de App middels een digitaal ondertekend Document aan dat de burger financiële informatie op wil gaan vragen. Het resulteert in een configurationToken die de organisatie aan de App verstuurt waarmee deze later de daadwerkelijke financiële informatie op kan vragen, in het RequestFinancialInformation protocol.

Het protocol kent de volgende participanten:

De App en het CitizenFinancialClaimProcess maken aan het begin van het protocol gebruik van het CreateSession protocol voor het authenticeren van de App naar de organisatie en het produceren van een AES sleutel voor versleuteling van het verkeer tussen de App en organisatie. De stappen van dit protocol worden hier niet expliciet getoond of uitgeschreven.

2.2.1 Protocolbeschrijving

Het protocol ziet er in een sequence diagram als volgt uit.

`ConfigureRequest` protocol
Figuur 1 ConfigureRequest protocol

2.2.2 Protocolberichten

Er volgt een expliciete beschrijving van de protocolberichten, die refereert aan de genummerde stappen in bovenstaand sequence diagram. Alle whitespace in JSON structuren is enkel bedoeld voor de leesbaarheid van deze standaard en dient niet te worden opgenomen in implementaties.

2.2.2.1 Stap 1

De App gebruikt het CreateSession protocol uit de Blauwe Knop Connect standaard voor authenticatie, resulterend in een sessionToken en een AES key voor later gebruik.

2.2.2.2 Stap 2 en 3

De App stelt een Document JWS samen (zie de sectie over Documenten hierboven), met "FINANCIAL_CLAIMS_INFORMATION_REQUEST" als type, en zonder version en body.

Voorbeeld:

{
  "typ": "jwt",
  "alg": "ES256"
}
.
{
  "sub": "document",
  "type": "FINANCIAL_CLAIMS_INFORMATION_REQUEST"
}
2.2.2.3 Stap 4

De App versleutelt het Document JWS met de AES key van de sessie in de vorm van een JWE (zie de Cryptografie sectie in de Blauwe Knop Connect standaard).

2.2.2.4 Stap 5

De App verstuurt het versleutelde Document JWS naar de CitizenFinancialClaimsProcess middels een HTTP POST met de volgende inhoud:

  • HTTP headers:
    • Authorization: het sessionToken uit stap 1.
  • POST body: het versleutelde Document JWS.

Voorbeeld:

POST /configure_claims_request HTTP/1.1
Host: organization.example.com
Authorization: 9YryEzKheqpx5iS2JsDNRHoydCBIsAKV

eyNaIioBb2_Jhb...x5Nz-g
2.2.2.5 Stap 12

De CitizenFinancialClaimProcess genereert met een CSPRNG een willekeurige alfanumerieke configuration token die minimaal 22 karakters MOET zijn (zodat hij minimaal 128 bit entropie heeft).

2.2.2.6 Stap 15 en 16

De CitizenFinancialClaimsProcess maakt een JSON object met daarin de volgende velden:

  • sub: MOET de vaste waarde configuration_token hebben.
  • iss: de URL van de CitizenFinancialClaimsProcess.
  • configuration_token: het configuration_token uit stap 8.

Voorbeeld:

{
  "sub": "configuration_token",
  "iss": "https://citizen-financial-claims-process.example.com/",
  "configuration_token": "LarRGSbmUPYtRYO6BQ4yn8"
}

De CitizenFinancialClaimsProcess versleutelt dit JSON object met de AES key van de sessie in de vorm van een JWE (zie de Cryptografie sectie in de Blauwe Knop Connect standaard), en stuurt dat in de HTTP response behorende bij het HTTP request uit Stap 5 terug naar de app.

2.2.2.7 Stap 17 en 18

De App ontsleutelt de JWE met de session AES key, en valideert dat:

  1. dit resulteert in een JSON object, en
  2. dat dit JSON object de velden uit Stap 15 bevat, met iss en sub de waardes zoals daar gespecificeerd.

2.3 Financiële informatie opvragen: RequestFinancialInformation

Middels het RequestFinancialInformation protocol kan de burger financiële informatie opvragen. Het resulteert in een door de organisatie digitaal ondertekend Document met daarin de financiële informatie. Dit protocol kan alleen worden uitgevoerd als de App en organisatie eerder het ConfigureRequest protocol hebben uitgevoerd, zodat de App beschikking heeft over een configurationToken. Daarnaast maken ook in dit protocol (net als ConfigureRequest) de App en het CitizenFinancialClaimProcess gebruik van het CreateSession protocol voor het authenticeren van de App naar de organisatie en het produceren van een AES sleutel voor versleuteling van verder verkeer tussen de App en organisatie. (De ConfigureRequest en RequestFinancialInformation protocollen hebben ieder een eigen authenticatiesessie nodig: dat wil zeggen, het sessionToken resulterende uit het CreateSession protocol dat werd uitgevoerd tijdens het ConfigureRequest protocol kan niet worden hergebruikt in het RequestFinancialInformation protocol. In plaats daarvan moet CreateSession opnieuw worden uitgevoerd.)

Dit protocol kent dezelfde participanten als het ConfigureRequest protocol, en daarnaast ook de volgende participant:

Net als in het ConfigureRequest protocol wordt het sessionToken gebruikt als identifier voor de sessie. Deze wordt niet op applicatielaag versleuteld (uiteraard wel op transportniveau middels TLS), omdat de organisatie middels het sessionToken de AES key moet opzoeken die voor versleuteling gebruikt kan worden. Het configurationToken en al het verdere verkeer wordt echter wel op applicatielaag versleuteld opgestuurd (en daarnaast nog eens middels TLS).

2.3.1 Protocolbeschrijving

Het protocol ziet er in een sequence diagram als volgt uit.

`RequestFinancialInformation` protocol
Figuur 2 RequestFinancialInformation protocol

2.3.2 Protocolberichten

Er volgt een expliciete beschrijving van de protocolberichten, die refereert aan de genummerde stappen in bovenstaand sequence diagram. Alle whitespace in JSON structuren is enkel bedoeld voor de leesbaarheid van deze standaard en dient niet te worden opgenomen in implementaties.

2.3.2.1 Stap 1

De App gebruikt het CreateSession protocol uit de Blauwe Knop Connect standaard voor authenticatie, resulterend in een sessionToken en een AES key voor later gebruik.

2.3.2.2 Stap 2 en 3

De App maakt een JSON object met daarin de volgende velden:

  • sub: MOET de vaste waarde configuration_token hebben.
  • iss: MOET de vaste waarde bk-connect://app/ hebben.
  • configuration_token: het configuration_token uit het ConfigureRequest protocol.

Voorbeeld:

{
  "sub": "configuration_token",
  "iss": "bk-connect://app/",
  "configuration_token": "LarRGSbmUPYtRYO6BQ4yn8"
}

Vervolgens versleutelt de App dit object met de session AES key uit het CreateSession protocol in de vorm van een JWE (zie de Cryptografie sectie in de Blauwe Knop Connect standaard).

2.3.2.3 Stap 3

De App verstuurt een HTTP POST naar de CitizenFinancialClaimsProcess met de volgende inhoud:

  • Query parameters:
    • configurationToken: De JWE uit stap 2.
  • HTTP headers:
    • Authorization: het sessionToken uit stap 1.

Voorbeeld:

POST /request_financial_claims_information?configurationToken=eylNzToF_nyZU... HTTP/1.1
Host: organization.example.com
Authorization: 9YryEzKheqpx5iS2JsDNRHoydCBIsAKV
2.3.2.4 Stap 7 en 8

Het CitizenFinancialClaimsProcess ontsleutelt de JWE met de session AES key, en valideert dat:

  1. dit resulteert in een JSON object, en
  2. dat dit JSON object de velden uit Stap 2 bevat, met iss en sub de waardes zoals daar gespecificeerd.
2.3.2.5 Stap 12

Het CitizenFinancialClaimsProcess doet een HTTP POST request naar /financial_claims_information van het SourceSystem om financiële informatie op te vragen, met in de POST body een JSON object met daarin:

  • bsn: Het BSN in de vorm van een string.

Voorbeeld:

POST /financial_claims_information HTTP/1.1
Host: sourcesystem.example.com

{
  "bsn": "999991772"
}

NB: toegang tot het /financial_claims_information endpoint MOET geauthenticeerd zijn zodat enkel geauthoriseerde diensten waaronder het CitizenFinancialClaimsProcess er toegang toe hebben. Deze authenticatie valt buiten de scope van deze standaard, maar te denken valt aan een Authorization HTTP header met daarin een voorgeconfigureerd token, of het bereikbaar maken van het endpoint enkel binnen een intern netwerk van de organisatie, of tweezijdig TLS, of een combinatie van deze maatregelen.

2.3.2.6 Stap 13

Het SourceSystem antwoordt met een JSON object met daarin de financiële informatie.

2.3.2.7 Stap 14 en 15

De CitizenFinancialClaimsProcess stelt op basis van de response van het SourceSystem die hij heeft geraadpleegd een Document JWS samen (zie de sectie over Documenten hierboven), met "FINANCIAL_CLAIMS_INFORMATION_RESPONSE" als type, en de financiële informatie in de body.

Voorbeeld:

{
  "typ": "jwt",
  "alg": "ES256",
  "kid": "1"
}
.
{
  "sub": "document",
  "type": "FINANCIAL_CLAIMS_INFORMATION_RESPONSE",
  "version": "2",
  "body": {
    // financial document as returned by the SourceSystem
  }
}
2.3.2.8 Stap 16 t/m 18

De CitizenFinancialClaimsProcess versleutelt bovenstaande Document JWS met de AES key van de sessie in de vorm van een JWE (zie de Cryptografie sectie in de Blauwe Knop Connect standaard), en stuurt dat in de HTTP response behorende bij het HTTP request uit Stap 3 terug naar de app.

3. Conformiteit

Naast onderdelen die als niet normatief gemarkeerd zijn, zijn ook alle diagrammen, voorbeelden, en noten in dit document niet normatief. Verder is alles in dit document normatief.

De trefwoorden MAG en MOET in dit document moeten worden geïnterpreteerd als in BCP 14 [RFC2119] [RFC8174] als, en alleen als deze in hoofdletters zijn weergegeven, zoals hier getoond.

4. Lijst met figuren

A. Referenties

A.1 Normatieve referenties

[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
Overheidsbrede Standaard - Werkversie