Сообщение об ошибке
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: WebCrypto не включает эту кривую, хотя она такая же кривая EC, как семейство P-*. Проверка выполняется до какой-либо работы с ключевым материалом, поэтому тот же самый вызов пройдёт, как только имя будет исправлено.
Почему это происходит
Кривая secp256k1 запрошена у WebCrypto
частоКод для Bitcoin/Ethereum часто рассчитывает, что namedCurve: "secp256k1" будет работать так же, как P-256. Так не было никогда: реестр WebCrypto включает только P-256, P-384 и P-521. (Модуль crypto в Node, не относящийся к WebCrypto, secp256k1 поддерживает.)
Имена в стиле JWT вместо имён алгоритмов
часто«ES256», «RS256» или «ECDSA_P256_SHA256» — идентификаторы JOSE и других экосистем. WebCrypto ожидает { name: "ECDSA", namedCurve: "P-256" } для ключей и { name: "ECDSA", hash: "SHA-256" } для операций.
Новые алгоритмы в старых средах выполнения
иногдаEd25519/X25519 появились в WebCrypto в 2023–2025 годах; старые браузеры, старые версии Node и некоторые WebView до сих пор их отклоняют. Прежде чем на них полагаться, проверяйте поддержку.
Как исправить
- 1.
Используйте точные идентификаторы WebCrypto
Имена алгоритмов сравниваются без учёта регистра, но должны быть зарегистрированными, а имена кривых должны совпадать точно. Обратите внимание на два словаря: generateKey/importKey принимают namedCurve, а sign/verify — hash; если их перепутать, получится отдельная разновидность этой ошибки.
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 встроенный модуль crypto (не WebCrypto) поддерживает эту кривую нативно, поэтому у серверного кода есть два варианта.
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" });