Перейти к содержимому
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 и показывают фактическую кривую и тип ключа, и обычно это сразу указывает на несоответствие.

Связанные ошибки

Открыть всю базу ошибок подписей