Wat is een JSON Web Key (JWK)?
Een JSON Web Key (JWK) is een op JSON gebaseerd formaat dat wordt gebruikt voor het vertegenwoordigen van cryptografische sleutels. Het wordt veel gebruikt in de context van JSON Web Signature (JWS) en JSON Web Encryption (JWE) om de integriteit en vertrouwelijkheid van JSON Web Tokens te valideren. Het wordt ook gebruikt in OpenID Connect (OIDC) voor identity en access management (beheer).
Bijvoorbeeld, een PEM-gecodeerde ECDSA-publieke sleutel:
-----BEGIN PUBLIC KEY-----
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEF/xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4
f1Qx3y49cUm646fMBX9DYx+43HzXm6VdX77uFymz90aO4dBunpTdUzLFRAiT7+In
gzZGDrIE+FG6CcqQuRP65r65SUzDOmP5
-----END PUBLIC KEY-----
…kan worden weergegeven als een JWK:
{
"kty": "EC",
"crv": "P-384",
"x": "F_xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4f1Qx3y49cUm646fMBX9DYx-43HzXm6Vd",
"y": "X77uFymz90aO4dBunpTdUzLFRAiT7-IngzZGDrIE-FG6CcqQuRP65r65SUzDOmP5"
}
Hoe werkt een JWK?
Omdat JWK een op JSON gebaseerd formaat is, kan het rijke metadata over de sleutel bevatten in vergelijking met traditionele formaten zoals PEM. Hier zijn enkele veelvoorkomende attributen in een JWK:
kty
(Key Type): De cryptografische algoritmefamilie die met de sleutel wordt gebruikt. Veelvoorkomende waarden zijnRSA
,EC
enoct
.EC
is gemarkeerd als “Recommended+” in RFC 7518 .use
(Public Key Use): Het beoogde gebruik van de openbare sleutel. Veelvoorkomende waarden zijnsig
(handtekening) enenc
(encryptie).key_ops
(Key Operations): De ondersteunde sleutelbewerkingen. Veelvoorkomende waarden zijnsign
,verify
,encrypt
endecrypt
.alg
(Algorithm): Het algoritme dat bedoeld is voor gebruik met de sleutel. Afhankelijk van het sleuteltype kan het algoritme variëren. Bijvoorbeeld,RS256
kan worden gebruikt met een RSA-sleutel, terwijlES256
kan worden gebruikt met een EC-sleutel.kid
(Key ID): Een unieke identifier voor de sleutel. Deze kan worden gebruikt om een specifieke sleutel in een set van sleutels te matchen.
Behalve kty
zijn alle andere attributen optioneel en kunnen ze worden gebruikt om extra context over de sleutel te bieden. In overeenstemming met de waarde van kty
kunnen andere attributen vereist zijn of optioneel. In het bovenstaande voorbeeld vertegenwoordigt de JWK een ECDSA-sleutel (kty: "EC"
) met een curve van P-384 (crv: "P-384"
). De x
en y
attributen bevatten de coördinaten van de publieke sleutel.
Hier is nog een niet-normatief voorbeeld van een RSA-publieke-sleutel JWK:
{
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"n": "0vx7agoebGcQSuuPiLJXZpt...-TmV4HCA1T8jXg3fE2VbA",
"e": "AQAB",
"kid": "2011-04-29-1234"
}
Voor gedetailleerde informatie over JWK-attributen en hun betekenissen, raadpleeg RFC 7517 .
JSON Web Key Set (JWKS)
Wanneer meerdere JWK’s moeten worden gegroepeerd, worden ze georganiseerd in een JSON Web Key Set (JWKS). Een JWKS is een JSON-object dat een array van JWK’s bevat. Het wordt vaak gebruikt in de respons van het jwks_uri
-endpoint in OpenID Connect (OIDC) Discovery om de publieke sleutels te verstrekken voor JWT Ondertekeningssleutel (Signing key) validatie.
Hier is een niet-normatief voorbeeld van een JWKS met twee JWK’s:
{
"keys": [
{
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"n": "0vx7agoebGcQSuuPiLJXZpt...-TmV4HCA1T8jXg3fE2VbA",
"e": "AQAB",
"kid": "2011-04-29-1234"
},
{
"kty": "EC",
"crv": "P-384",
"x": "F_xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4f1Qx3y49cUm646fMBX9DYx-43HzXm6Vd",
"y": "X77uFymz90aO4dBunpTdUzLFRAiT7-IngzZGDrIE-FG6CcqQuRP65r65SUzDOmP5"
}
]
}
In dit voorbeeld bevat de JWKS twee JWK’s: één RSA-sleutel en één EC-sleutel. Het keys
attribuut is een array van JWK’s, elk met een andere sleutel.