本文へスキップ
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 の変換を正しく行う

    アーマー行(BEGIN/END 行)を取り除き、本体を 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 をローカルで解析して実際の曲線と鍵の種類を表示するので、たいていはすぐに不一致の箇所がわかります。

関連するエラー

署名エラーデータベースをすべて見る