エラーメッセージ
NotSupportedError: Unrecognized algorithm name
上記は Node の文言です。Node は未知の曲線に対して「Unrecognized namedCurve」も報告します。Chrome は「Failed to execute 'generateKey' on 'SubtleCrypto': Algorithm: Unrecognized name」、Firefox は「Operation is not supported」、Safari は「The operation is not supported.」と出力します。変わらないのは DOMException の名前 NotSupportedError です。
WebCrypto crypto.subtle — browsers & Node
このエラーの意味
指定したアルゴリズム(または曲線)は、この WebCrypto 実装が提供しているものではありません。識別子の綴りが間違っているか、本当に標準のセットに含まれないものを要求しています。最も多いのは secp256k1 で、P-* ファミリーと同じ EC 曲線であるにもかかわらず、WebCrypto には含まれていません。このチェックは鍵データに触れる前に行われるため、名前を直せばまったく同じ呼び出しが成功します。
発生する理由
WebCrypto に secp256k1 を要求している
よくあるBitcoin や Ethereum のコードは、namedCurve: "secp256k1" が P-256 と同じように動作すると想定していることがよくあります。しかし、これまで一度も動作したことはありません。WebCrypto のレジストリに含まれるのは P-256、P-384、P-521 だけです。(WebCrypto ではない Node の crypto モジュールは、secp256k1 に対応しています。)
JWT 形式の名前をアルゴリズム名として使っている
よくある「ES256」「RS256」「ECDSA_P256_SHA256」は、JOSE やほかのエコシステムの識別子です。WebCrypto では、鍵には { name: "ECDSA", namedCurve: "P-256" }、操作には { name: "ECDSA", hash: "SHA-256" } を指定します。
古いランタイムで新しいアルゴリズムを使っている
ときどきEd25519/X25519 は 2023〜2025年にかけて WebCrypto に導入されました。古いブラウザー、古いバージョンの Node、一部の WebView では、いまだに拒否されます。頼る前に機能検出を行ってください。
修正方法
- 1.
WebCrypto の識別子を正確に使う
名前は大文字と小文字を区別せずに照合されますが、登録済みの名前でなければなりません。また、曲線名は完全に一致する必要があります。2 つの辞書に注意してください。generateKey/importKey は namedCurve を、sign/verify は hash を受け取ります。この 2 つを取り違えるのも、このエラーの一種です。
js const key = await crypto.subtle.generateKey( { name: "ECDSA", namedCurve: "P-256" }, // not "ES256", not "secp256r1" false, ["sign", "verify"], ); const sig = await crypto.subtle.sign({ name: "ECDSA", hash: "SHA-256" }, key.privateKey, data); - 2.
secp256k1 にはライブラリを使う
ブラウザーでは、監査済みの純粋な JS 実装を使うのが標準的な方法です。Node では、組み込みの(WebCrypto ではない)crypto モジュールがこの曲線にネイティブで対応しているため、サーバー側のコードには選択肢が 2 つあります。
js // browser: @noble/curves (audited, dependency-free) import { secp256k1 } from "@noble/curves/secp256k1"; const ok = secp256k1.verify(signature, msgHash, publicKey); // node: built-in crypto.generateKeyPairSync("ec", { namedCurve: "secp256k1" });