Mensagem de erro
error:1E08010C:DECODER routines::unsupported
Reproduzido no Node 26 / OpenSSL 3.x. A CLI do OpenSSL imprime a forma longa: “error:1E08010C:DECODER routines:OSSL_DECODER_from_bio:unsupported”. No Node ≤16 (OpenSSL 1.1.1), os mesmos equívocos produziam mensagens diferentes.
Node.js crypto (OpenSSL 3) — code ERR_OSSL_UNSUPPORTED
O que significa
O decodificador do OpenSSL 3 não conseguiu interpretar o material de chave que você passou para createPrivateKey(), createPublicKey(), sign() ou verify(). Apesar da palavra “unsupported”, quase nunca se trata de um algoritmo ausente — significa que os bytes não formam uma chave legível em nenhum dos formatos que o decodificador tentou.
Por que acontece
PEM de uma variável de ambiente com \n literal
comumGerenciadores de segredos e arquivos .env muitas vezes entregam “-----BEGIN PRIVATE KEY-----\nMIG...” com a barra invertida e o n como dois caracteres. O OpenSSL vê um arquivo de uma linha só, sem enquadramento PEM válido, e desiste.
String vazia ou conteúdo que não é chave
comumA variável contém "", um caminho de arquivo (em vez do conteúdo do arquivo), um blob JSON ou um certificado quando se esperava apenas uma chave. Tudo o que não é material de chave PEM/DER cai exatamente neste erro.
Classe de chave errada para a API
comumPassar um PEM de chave pública para createPrivateKey() falha com esta mensagem — o decodificador procura uma estrutura de chave privada e não encontra nenhuma. O inverso não é erro: createPublicKey() aceita uma chave privada e deriva dela a metade pública.
Bytes DER sem metadados de formato
ocasionalBytes DER brutos passados como um Buffer simples são interpretados como PEM por padrão. Sem { format: "der", type: "pkcs8" | "spki" | "sec1" }, o decodificador não tem como saber que estrutura esperar.
Como corrigir
- 1.
Normalizar os PEMs vindos de variáveis de ambiente e conferir o rótulo
Restaure as quebras de linha e imprima a primeira linha. Se o rótulo diz PUBLIC KEY onde você chama createPrivateKey, a variável aponta para a chave errada.
js const pem = process.env.SIGNING_KEY.replace(/\\n/g, "\n"); console.log(pem.split("\n")[0]); // -----BEGIN PRIVATE KEY----- → createPrivateKey(pem) // -----BEGIN PUBLIC KEY----- → createPublicKey(pem) // -----BEGIN EC PRIVATE KEY----- → createPrivateKey(pem) (SEC1, also fine) - 2.
Declarar o DER explicitamente
Quando a chave é DER binário (de um blob do banco de dados, de uma conversão de JWKS ou de protobuf), informe o formato e o tipo; o decodificador não vai adivinhar.
js import { createPrivateKey } from "node:crypto"; const key = createPrivateKey({ key: derBuffer, format: "der", type: "pkcs8", // or "sec1" for BEGIN EC PRIVATE KEY material }); - 3.
Verificar o material fora do Node
Deixe o OpenSSL dizer o que os bytes realmente são. Se isso também falhar, os próprios dados estão corrompidos — corrija a origem, não a chamada no Node.
bash openssl pkey -in key.pem -noout -text | head # for DER: openssl pkey -in key.der -inform der -noout -text | head