Mensagem de erro
Invalid JWK EC key
Node.js crypto — TypeError, code ERR_CRYPTO_INVALID_JWK
O que significa
createPublicKey/createPrivateKey com format: "jwk" rejeitou o objeto JWK: faltam membros obrigatórios, as coordenadas não podem ser decodificadas ou o ponto (x, y) não está de fato na curva indicada. O Node valida o ponto na importação, então uma coordenada corrompida ou truncada é detectada aqui, em vez de produzir uma chave que nunca verifica nenhuma assinatura. As mesmas verificações acontecem quer a JWK venha de um endpoint JWKS, de um arquivo de configuração ou de outro serviço — o erro aponta para o objeto, não para o transporte.
Por que acontece
Coordenadas que não estão em base64url
comumOs valores x/y/d de uma JWK precisam estar em base64url sem padding (RFC 7518). Strings hexadecimais e inteiros decimais não decodificam para os 32 bytes esperados para P-256. O Node tolera uma variante: base64 padrão com + / e padding = é importado sem reclamação, enquanto os navegadores rejeitam a mesma JWK com um DataError — uma chave que funciona no servidor ainda pode falhar no cliente.
Coordenada truncada ou corrompida
comumUma coordenada que perdeu um caractere no caminho, ou teve um alterado, descreve outro número, e o ponto sai da curva. O clássico bug do zero à esquerda — um codificador que grava 31 bytes porque o primeiro byte era zero — é o único truncamento que o Node perdoa: o número não muda, então a chave é importada. Os navegadores rejeitam a mesma JWK (“should be 32” bytes), e é por isso que vale a pena corrigir mesmo assim.
O crv não corresponde ao material da chave
ocasionalUma JWK marcada com crv: "P-256" que carrega coordenadas de secp256k1 ou de P-384 (depois de uma edição manual ou de copiar e colar um modelo) não pode descrever um ponto na curva declarada.
Como corrigir
- 1.
Validar a estrutura da JWK antes de importá-la
Confira os membros e os comprimentos após a decodificação. Para P-256, x e y precisam decodificar, cada um, para exatamente 32 bytes.
js const x = Buffer.from(jwk.x, "base64url"); const y = Buffer.from(jwk.y, "base64url"); console.log(jwk.kty, jwk.crv, x.length, y.length); // EC P-256 32 32 - 2.
Completar coordenadas curtas com zeros à esquerda
Se quem gerou o valor removeu os zeros à esquerda, restaure o comprimento fixo antes de montar a JWK.
js const pad32 = (b) => Buffer.concat([Buffer.alloc(32 - b.length), b]); jwk.x = pad32(Buffer.from(jwk.x, "base64url")).toString("base64url"); jwk.y = pad32(Buffer.from(jwk.y, "base64url")).toString("base64url"); const key = crypto.createPublicKey({ key: jwk, format: "jwk" }); - 3.
Regenerar a partir de uma fonte confiável
Se as coordenadas não passam na validação e não foi você quem montou a JWK, busque-a de novo no endpoint JWKS do emissor em vez de consertar bytes — uma JWK que precisa de cirurgia é uma JWK em que você não deve confiar.