Aller au contenu
ecdsa.com
jose (JavaScript)JWKS et découverte des clés

Message d’erreur

no applicable key found in the JSON Web Key Set

jose (JavaScript) — JWKSNoMatchingKey, code ERR_JWKS_NO_MATCHING_KEY

Ce que cela signifie

jose a parcouru le jeu de clés (JSON Web Key Set) que vous lui avez fourni et n’y a trouvé aucune clé autorisée à vérifier ce jeton. Une clé n’est retenue que si toutes ces conditions sont réunies : son `kid` est égal au `kid` de l’en-tête du jeton (lorsque le jeton en a un), son `kty` correspond à l’`alg` du jeton, son `alg` (s’il est présent) est égal à l’`alg` du jeton, son `crv` correspond (P-256 pour ES256), `use` est absent ou vaut `"sig"`, et `key_ops` (s’il est présent) inclut `"verify"`. Aucune opération cryptographique n’a été exécutée : l’échec se situe dans la sélection de la clé.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Comparer le kid du jeton avec les clés publiées

    Décodez l’en-tête protégé et listez les clés publiées avec leurs `kid`, `alg`, `kty`, `crv` et `use`. Si le `kid` est absent du jeu, il s’agit d’une rotation ou du mauvais jeu de clés ; s’il est présent, examinez les champs de métadonnées.

    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.

    Récupérer le JWKS de l’émetteur au lieu d’épingler des clés

    `createRemoteJWKSet` met les clés en cache et récupère de nouveau le jeu lorsqu’un jeton désigne un `kid` qu’il n’a pas encore vu : les rotations sont ainsi prises en compte automatiquement, sans accepter de clés arbitraires.

    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.

    Publier des clés aux métadonnées cohérentes

    Si vous gérez l’émetteur, assurez-vous que chaque clé de signature possède un `kid` unique, `use: "sig"`, ainsi qu’un `alg` et un `crv` qui correspondent aux jetons qu’elle signe. Publiez la nouvelle clé avant de commencer à signer avec elle.

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

Erreurs associées

Parcourir toute la base de données des erreurs de signature