Saltar al contenido
ecdsa.com
WebCrypto crypto.subtle.sign / verifyWebCrypto

Mensaje de error

InvalidAccessError: Unable to use this key to verify

El texto de arriba es el de Node (con sign aparece «Unable to use this key to sign», y con una clave de otro algoritmo, «Key algorithm mismatch»). Los navegadores lo formulan de otra manera —Chrome, «key.usages does not permit this operation»; Firefox, «A parameter or an operation is not supported by the underlying object»; Safari, «CryptoKey doesn't support verification»—, pero el nombre de la DOMException, InvalidAccessError, es el mismo en todas partes.

WebCrypto crypto.subtle.sign / verify — browsers & Node

Qué significa

El objeto de clave que pasas no tiene permiso para realizar esta operación: su array de usos no la incluye, el tipo de clave es incorrecto (verificar con una clave privada, firmar con una pública) o la clave pertenece a un algoritmo distinto del que pide la llamada. El material de la clave puede ser perfectamente válido; lo que no lo es son sus permisos o su rol.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Declarar los usos que vas a necesitar

    Enumera todas las operaciones previstas al generar o importar la clave; vuelve a importar el mismo material con otros usos cuando una clave cumple varios roles.

    js
    const keyPair = await crypto.subtle.generateKey(
      { name: "ECDSA", namedCurve: "P-256" },
      true,
      ["sign", "verify"],   // privateKey gets "sign", publicKey gets "verify"
    );
  2. 2.

    Pasar la mitad correcta a cada llamada

    Al depurar, revisa key.type y key.usages: indican exactamente qué puede hacer el objeto.

    js
    console.log(key.type, key.usages); // e.g. "public" ["verify"]
    
    const sig = await crypto.subtle.sign(alg, keyPair.privateKey, data);
    const ok  = await crypto.subtle.verify(alg, keyPair.publicKey, sig, data);

Errores relacionados

Explorar toda la base de datos de errores de firma