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
Uma string PEM passada diretamente
comumO texto `-----BEGIN PUBLIC KEY-----` vindo de um servidor, de um arquivo de configuração ou da documentação de uma biblioteca JWT. Antes, ele precisa ser decodificado de base64 para DER.
Texto em Base64 em vez de bytes
comumMesmo sem as linhas do envelope, uma string base64 continua sendo uma string. Decodifique-a em bytes com `atob` (ou com `Uint8Array.fromBase64`, onde estiver disponível).
Uma JWK como texto JSON
ocasionalCom o formato `"jwk"`, um texto gerado por `JSON.stringify` falha da mesma forma; passe o objeto já analisado.
Como corrigir
- 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.
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"]);