跳到主要内容
ecdsa.com
WebCrypto crypto.subtle.importKeyWebCrypto

错误信息

DataError: Data provided to an operation does not meet requirements

应该匹配的是 DOMException 名称 DataError;消息文本因运行时而异。Firefox 和 Safari 显示上面那句通用的话;Chrome 常常让消息为空,或者指出原因(“The imported EC key specifies a different curve than requested”);Node 打印“Invalid keyData”或“Named curve mismatch”之类的具体原因。

WebCrypto crypto.subtle.importKey — browsers & Node

含义

importKey(或 unwrapKey)拒绝了这些密钥字节:它们无法按你声明的格式解析,或者其内容与算法参数相矛盾(曲线不对、JWK 字段不匹配)。这相当于 WebCrypto 在说“这些字节不是你所说的那个密钥”——在创建任何密钥对象之前就会抛出。

原因

修复方法

  1. 1.

    正确完成 PEM → ArrayBuffer 转换

    去掉封装行,对正文做 base64 解码,然后根据 PEM 标签选择格式:PUBLIC KEY → spki,PRIVATE KEY → pkcs8。

    js
    function pemToArrayBuffer(pem) {
      const b64 = pem.replace(/-----[^-]+-----/g, "").replace(/\s+/g, "");
      return Uint8Array.from(atob(b64), (c) => c.charCodeAt(0)).buffer;
    }
    
    const key = await crypto.subtle.importKey(
      "spki", pemToArrayBuffer(publicKeyPem),
      { name: "ECDSA", namedCurve: "P-256" },
      false, ["verify"],
    );
  2. 2.

    如果手头是 JSON 密钥材料,优先使用 JWK

    JWKS 端点提供的本来就是可直接用于 WebCrypto 的对象——无需二进制转换,crv 也随密钥一起提供。

    js
    const key = await crypto.subtle.importKey(
      "jwk", jwk,
      { name: "ECDSA", namedCurve: jwk.crv },
      false, ["verify"],
    );
  3. 3.

    确认这些字节究竟是什么

    把密钥粘贴到下方的证书解码器或签名验证工具中——两者都会在本地解析 SPKI/PKCS#8/JWK,并报告实际的曲线和密钥类型,通常一眼就能看出哪里不匹配。

相关错误

浏览完整的签名错误库