跳到主要内容
ecdsa.com
WebCrypto crypto.subtle.sign / verifyWebCrypto

错误信息

InvalidAccessError: Unable to use this key to verify

这是 Node 的措辞(sign 报“Unable to use this key to sign”,使用其他算法的密钥则报“Key algorithm mismatch”)。浏览器的表述各不相同——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”——但 DOMException 名称 InvalidAccessError 在各处都相同。

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

含义

你传入的密钥对象不允许执行这个操作:要么它的 usages 数组中没有这个操作,要么密钥类别不对(用私钥验证,或用公钥签名),要么密钥所属的算法与调用要求的算法不同。密钥材料本身可能完全有效——有问题的是它的权限或角色。

原因

修复方法

  1. 1.

    声明将要用到的用途

    生成或导入时列出每一项计划执行的操作;如果一个密钥要承担多个角色,就用不同的用途把同一份密钥材料重新导入。

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

    为每个调用传入密钥对中正确的那一半

    调试时查看 key.type 和 key.usages——它们准确说明了该对象允许做什么。

    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);

相关错误

浏览完整的签名错误库