Aller au contenu
ecdsa.com
jsonwebtoken / jws / jwa (Node.js)Bibliothèques JWT

Message d’erreur

TypeError: "ES256" signatures must be "64" bytes, saw "71"

Également affiché sous la forme

  • "ES256" signatures must be "64" bytes, saw "70"
  • "ES256" signatures must be "64" bytes, saw "72"
  • "ES384" signatures must be "96" bytes, saw "103"
  • "ES512" signatures must be "132" bytes, saw "139"

Le nombre qui suit « saw » varie entre 70 et 72 pour ES256 (la longueur DER dépend des bits de poids fort de r et de s) ; ES384 attend 96 octets et ES512 132. L’erreur est un simple `TypeError`, pas un `JsonWebTokenError` : les tests `instanceof` portant sur les erreurs de jsonwebtoken ne l’interceptent donc pas.

jsonwebtoken / jws / jwa (Node.js) — TypeError from ecdsa-sig-formatter

Ce que cela signifie

Le segment de signature du jeton se décode en 71 octets, alors qu’une signature JWS ES256 doit faire exactement 64 octets : la concaténation brute r‖s définie dans la RFC 7518 §3.4. Une valeur de 70 à 72 octets qui commence par `0x30` est l’encodage ASN.1 DER de la même signature, c’est-à-dire le format que produisent par défaut OpenSSL, Java, les services KMS et `crypto.sign()` de Node. Le jeton a été créé par un signataire qui a omis la conversion de DER vers brut ; jsonwebtoken (via ecdsa-sig-formatter) le rejette avant toute vérification.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Demander r‖s brut à node:crypto

    `dsaEncoding: "ieee-p1363"` fait produire à Node le format de longueur fixe qu’exige JWS. Mieux encore, signez avec une bibliothèque JOSE (`jwt.sign` de jsonwebtoken, `SignJWT` de jose), qui s’en charge pour vous.

    js
    import { sign } from "node:crypto";
    
    const signature = sign("sha256", Buffer.from(signingInput), {
      key: privateKey,
      dsaEncoding: "ieee-p1363", // raw r||s: 64 bytes for P-256, as RFC 7518 §3.4 requires
    });
    const token = signingInput + "." + signature.toString("base64url");
  2. 2.

    Convertir le DER d’un KMS avant d’assembler le jeton

    `ecdsa-sig-formatter` (installé avec jsonwebtoken via jws/jwa) convertit le DER au format JOSE. Le convertisseur DER ⇄ brut affiche r et s pour les deux formes, afin que vous puissiez confirmer la conversion.

    js
    import ecdsaSigFormatter from "ecdsa-sig-formatter";
    
    // AWS KMS and Google Cloud KMS return DER; convert once before assembling the JWS.
    const derSignature = Buffer.from(kmsResponse.Signature);
    const joseSignature = ecdsaSigFormatter.derToJose(derSignature, "ES256"); // base64url, 64 bytes decoded
    const token = signingInput + "." + joseSignature;

Erreurs associées

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