Pular para o conteúdo
ecdsa.com
WebCrypto SubtleCrypto.importKeyWebCrypto

Mensagem de erro

TypeError: Failed to execute 'importKey' on 'SubtleCrypto': The provided value is not of type '(ArrayBuffer or ArrayBufferView or JsonWebKey)'.

Também aparece como

  • TypeError: SubtleCrypto.importKey: Argument 2 is not an object.
  • TypeError: Type error

O texto acima é o do Chromium; o Firefox diz “SubtleCrypto.importKey: Argument 2 is not an object.”, e o Safari/WebKit, apenas “Type error”. O Node.js informa `ERR_INVALID_ARG_TYPE` para a mesma chamada.

WebCrypto SubtleCrypto.importKey — PEM text passed as keyData (Chromium / Firefox / WebKit)

O que significa

O `importKey` recebeu uma string como `keyData`. O WebCrypto nunca analisa texto: para `"spki"`, `"pkcs8"` e `"raw"`, ele espera DER binário (um `ArrayBuffer` ou um array tipado) e, para `"jwk"`, um objeto JavaScript. O navegador rejeita a chamada durante a conversão dos argumentos, antes de olhar o formato ou a chave — então o PEM pode ser perfeitamente válido.

Por que acontece

Como corrigir

  1. 1.

    Remover o envelope e decodificar para bytes

    Remova as linhas BEGIN/END e os espaços em branco, decodifique de base64 e escolha o formato pelo rótulo: `PUBLIC KEY` → `spki`, `PRIVATE KEY` → `pkcs8`.

    js
    function pemToDer(pem) {
      const base64 = pem.replace(/-----(BEGIN|END) [A-Z ]+-----/g, "").replace(/\s+/g, "");
      return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
    }
    
    const publicKey = await crypto.subtle.importKey(
      "spki", pemToDer(publicKeyPem),               // "PUBLIC KEY" -> spki, "PRIVATE KEY" -> pkcs8
      { name: "ECDSA", namedCurve: "P-256" }, false, ["verify"],
    );
  2. 2.

    Passar JWKs como objetos

    Endpoints JWKS já entregam objetos; analise o texto JSON uma única vez e passe o objeto com a curva correspondente.

    js
    const jwk = JSON.parse(jwkText);                  // an object, not the JSON string
    const key = await crypto.subtle.importKey("jwk", jwk, { name: "ECDSA", namedCurve: jwk.crv }, false, ["verify"]);

Erros relacionados

Ver toda a base de erros de assinatura