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
Los usos no incluían la operación al importar la clave
frecuenteLas claves de WebCrypto siguen el principio de mínimo privilegio: importKey(..., ["verify"]) produce una clave que solo puede verificar. Importar con [] o con ["sign"] y después llamar a verify() falla aquí: los usos se fijan al crear la clave y no se pueden añadir más tarde.
Mitades pública y privada intercambiadas
frecuentesubtle.sign necesita la clave privada; subtle.verify, la clave pública. Pasar keyPair.publicKey a sign (o privateKey a verify) es un error de rol que la API rechaza de entrada.
El algoritmo de la clave no coincide con el de la operación
ocasionalUna clave ECDH usada en una llamada de firma ECDSA (o al revés) falla incluso con la misma curva: WebCrypto vincula las claves al algoritmo para el que se crearon, así que los diseños de «una sola clave EC para ambos» tienen que importar el material dos veces.
Cómo solucionarlo
- 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.
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);