JWE-kryptering av request¶
API-et bruker JWE (JSON Web Encryption) for å kryptere request-body i POST-forespørsler. Klienten krypterer JSON-payloaden med vår offentlige nøkkel, hentet fra JWK-endepunktet.
Merk: JWE-signering benyttes ikke. Kun kryptering er i bruk. Klienten trenger ikke et eget sertifikat for signering.
Algoritmer¶
| Parameter | Verdi | Beskrivelse |
|---|---|---|
alg |
RSA-OAEP-256 |
Asymmetrisk algoritme for kryptering av CEK |
enc |
A256GCM |
Symmetrisk algoritme for kryptering av innhold |
Steg-for-steg: Kryptere en request¶
1. Hent offentlig nøkkel¶
Gjør et GET-kall til /api/frikortsporring/jwk for å hente gjeldende JWK.
Noter kid-verdien — den må inkluderes i JWE-headeren.
2. Bygg JSON-payload¶
Lag JSON-objektet som skal krypteres, f.eks.:
3. Krypter med JWE¶
Krypter JSON-payloaden til en JWE Compact Serialization-streng med følgende header-parametre:
Resultatet er en streng med fem Base64url-kodede deler separert med punktum:
4. Send request¶
Send JWE-strengen som request-body med Content-Type: application/jose:
POST /api/frikortsporring/helseid/v1 HTTP/1.1
Host: frikortbifrost.nav.no
Authorization: DPoP eyJ...
DPoP: eyJ...
Content-Type: application/jose
eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIiwia2lkIjoiZnJpa29ydGJpZnJvc3QtZW5jLTIwMjYwMzEyLTEifQ...
Responsen returneres som ukryptert JSON (application/json).
Hva er JWE?¶
JSON Web Encryption (JWE) er et kompakt format for kryptering av data ved hjelp av JSON-baserte mekanismer, definert i RFC 7516.
Komponenter i en JWE Compact Serialization¶
| Del | Beskrivelse |
|---|---|
| Protected Header | Metadata om krypteringen (alg, enc, kid). Base64url-kodet. |
| Encrypted Key | Tilfeldig generert symmetrisk nøkkel (CEK), kryptert med mottakerens offentlige RSA-nøkkel. |
| Initialization Vector | Tilfeldig verdi for unik kryptering per melding. Må være unik for hver request. |
| Ciphertext | Den krypterte JSON-payloaden. |
| Authentication Tag | Integritetsbeskyttelse (AES-GCM) som sikrer at innholdet ikke er endret under transport. |
Kodeeksempel (Java med Nimbus JOSE + JWT)¶
import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.RSAEncrypter;
import com.nimbusds.jose.jwk.*;
// 1. Hent JWK fra endepunktet
String jwkJson = new String(
new URL("https://frikortbifrost.nav.no/api/frikortsporring/jwk").openStream().readAllBytes(),
StandardCharsets.UTF_8
);
JWK jwk = JWK.parse(jwkJson);
// 2. Bruk nøkkelen direkte
RSAKey rsaKey = (RSAKey) jwk;
// 3. Bygg JWE-header
JWEHeader header = new JWEHeader.Builder(JWEAlgorithm.RSA_OAEP_256, EncryptionMethod.A256GCM)
.keyID(rsaKey.getKeyID())
.build();
// 4. Opprett JWE-objekt med JSON-payload
String jsonPayload = """
{
"borgerIdent": "12345678901",
"tjenestetypeKode": "LE",
"tjenestedato": "2026-06-15"
}
""";
JWEObject jweObject = new JWEObject(header, new Payload(jsonPayload));
// 5. Krypter
jweObject.encrypt(new RSAEncrypter(rsaKey));
// 6. Serialiser til JWE Compact Serialization
String jweString = jweObject.serialize();
// 7. Send jweString som request-body med Content-Type: application/jose
Maven-avhengighet: