本文へスキップ
ecdsa.com
WebCrypto SubtleCrypto.sign / verify with ECDSAWebCrypto

エラーメッセージ

TypeError: Failed to execute 'sign' on 'SubtleCrypto': EcdsaParams: hash: Missing or not an AlgorithmIdentifier

別の表記

  • TypeError: Failed to execute 'verify' on 'SubtleCrypto': EcdsaParams: hash: Missing or not an AlgorithmIdentifier
  • TypeError: Member EcdsaParams.hash is required and must be an instance of (object or DOMString)
  • NotSupportedError: Failed to execute 'sign' on 'SubtleCrypto': EcdsaParams: hash: Algorithm: Unrecognized name

上記は Chromium のテキストです(`verify` ではメソッド名が変わります)。Safari/WebKit は「Member EcdsaParams.hash is required and must be an instance of (object or DOMString)」、Firefox は汎用的な `SyntaxError`(「An invalid or illegal string was specified」)を報告します。

WebCrypto SubtleCrypto.sign / verify with ECDSA — algorithm parameter without hash (Chromium / WebKit)

このエラーの意味

WebCrypto の ECDSA では、ハッシュ関数を鍵ごとではなく操作ごとに指定します。`sign` と `verify` には `{ name: "ECDSA", hash: "SHA-256" }` が必要です。この呼び出しでは `hash` のないアルゴリズムオブジェクト(たいていは鍵生成時の `{ name, namedCurve }` オブジェクト)が渡されたため、ブラウザーは署名の前にパラメーターを拒否しました。(RSA 鍵は逆で、ハッシュはインポート時に固定されます。)`"SHA256"` のようにハッシュ名の綴りを誤った場合は、代わりに、認識できない名前に関する `NotSupportedError` で失敗します。

発生する理由

修正方法

  1. 1.

    鍵のパラメーターと操作のパラメーターを分ける

    鍵の作成用と署名用に、別々のオブジェクトを定義してください。JWT の ES256/ES384/ES512 では、それぞれ SHA-256/384/512 を P-256/384/521 と組み合わせて使います。

    js
    const KEY_ALG = { name: "ECDSA", namedCurve: "P-256" };   // generateKey / importKey
    const SIGN_ALG = { name: "ECDSA", hash: "SHA-256" };        // sign / verify (ES256)
    
    const pair = await crypto.subtle.generateKey(KEY_ALG, false, ["sign", "verify"]);
    const signature = await crypto.subtle.sign(SIGN_ALG, pair.privateKey, data);   // 64 bytes, raw r||s
    const ok = await crypto.subtle.verify(SIGN_ALG, pair.publicKey, signature, data);

関連するエラー

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