Gå til innhold

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.:

{
  "borgerIdent": "12345678901",
  "tjenestetypeKode": "LE",
  "tjenestedato": "2026-06-15"
}

3. Krypter med JWE

Krypter JSON-payloaden til en JWE Compact Serialization-streng med følgende header-parametre:

{
  "alg": "RSA-OAEP-256",
  "enc": "A256GCM",
  "kid": "<kid fra JWK>"
}

Resultatet er en streng med fem Base64url-kodede deler separert med punktum:

<protected_header>.<encrypted_key>.<initialization_vector>.<ciphertext>.<authentication_tag>

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:

<dependency>
    <groupId>com.nimbusds</groupId>
    <artifactId>nimbus-jose-jwt</artifactId>
</dependency>

🔗 Nyttige lenker