Zum Inhalt springen
ecdsa.com
jose (JavaScript)JWKS und Schlüsselermittlung

Fehlermeldung

no applicable key found in the JSON Web Key Set

jose (JavaScript) — JWKSNoMatchingKey, code ERR_JWKS_NO_MATCHING_KEY

Was der Fehler bedeutet

jose hat das JSON Web Key Set durchsucht, das du ihm übergeben hast, und keinen Schlüssel gefunden, der dieses Token prüfen darf. Ein Schlüssel kommt nur infrage, wenn alle diese Bedingungen gelten: Sein `kid` ist gleich dem `kid` im Header des Tokens (falls das Token einen hat), sein `kty` passt zum `alg` des Tokens, sein `alg` (falls vorhanden) ist gleich dem `alg` des Tokens, sein `crv` passt (P-256 für ES256), `use` fehlt oder ist `"sig"`, und `key_ops` (falls vorhanden) enthält `"verify"`. Es lief keine Kryptografie – der Fehler liegt in der Auswahl des Schlüssels.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    kid des Tokens mit den veröffentlichten Schlüsseln vergleichen

    Dekodiere den geschützten Header und liste die veröffentlichten Schlüssel mit ihren Werten für `kid`, `alg`, `kty`, `crv` und `use` auf. Fehlt der `kid` im Satz, hast du es mit einer Rotation oder dem falschen Schlüsselsatz zu tun; ist er vorhanden, sieh dir die Metadatenfelder an.

    bash
    # kid and alg the token asks for
    python3 -c 'import base64,json,sys; h=sys.argv[1].split(".")[0]; print(json.loads(base64.urlsafe_b64decode(h + "=" * (-len(h) % 4))))' "$TOKEN"
    # kid, alg, kty, crv, use of every key the issuer publishes
    curl -s https://issuer.example.com/.well-known/jwks.json | jq '.keys[] | {kid, alg, kty, crv, use}'
  2. 2.

    JWKS beim Aussteller abrufen, statt Schlüssel per Pinning festzuschreiben

    `createRemoteJWKSet` speichert die Schlüssel zwischen und ruft den Satz neu ab, wenn ein Token einen `kid` nennt, den es noch nicht kennt; so werden Rotationen automatisch übernommen, ohne beliebige Schlüssel zu akzeptieren.

    js
    import { createRemoteJWKSet, jwtVerify } from "jose";
    
    // Fetches the JWKS, caches it, and refetches when a token names an unknown kid
    // (at most once per cooldownDuration, 30 s by default).
    const jwks = createRemoteJWKSet(new URL("https://issuer.example.com/.well-known/jwks.json"));
    const { payload } = await jwtVerify(token, jwks, {
      algorithms: ["ES256"],
      issuer: "https://issuer.example.com",
    });
  3. 3.

    Schlüssel mit konsistenten Metadaten veröffentlichen

    Betreibst du den Aussteller, stelle sicher, dass jeder Signaturschlüssel einen eindeutigen `kid`, `use: "sig"` sowie `alg` und `crv` hat, die zu den Tokens passen, die er signiert. Veröffentliche den neuen Schlüssel, bevor du anfängst, mit ihm zu signieren.

    json
    {
      "keys": [
        { "kty": "EC", "crv": "P-256", "kid": "2026-10", "use": "sig", "alg": "ES256",
          "x": "…", "y": "…" }
      ]
    }

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen