Mensaje de error
error:1E08010C:DECODER routines::unsupported
Reproducido en Node 26 / OpenSSL 3.x. La CLI de OpenSSL imprime la forma larga: «error:1E08010C:DECODER routines:OSSL_DECODER_from_bio:unsupported». En Node ≤16 (OpenSSL 1.1.1), los mismos errores producían mensajes distintos.
Node.js crypto (OpenSSL 3) — code ERR_OSSL_UNSUPPORTED
Qué significa
El decodificador de OpenSSL 3 no pudo analizar el material de clave pasado a createPrivateKey(), createPublicKey(), sign() o verify(). Pese a la palabra «unsupported», casi nunca se trata de un algoritmo que falte: significa que los bytes no son una clave legible en ninguno de los formatos que probó el decodificador.
Por qué ocurre
PEM de una variable de entorno con \n literales
frecuenteLos gestores de secretos y los archivos .env suelen entregar «-----BEGIN PRIVATE KEY-----\nMIG...» con la barra invertida y la n como dos caracteres. OpenSSL ve un archivo de una sola línea, sin un formato PEM válido, y se rinde.
Cadena vacía o contenido que no es una clave
frecuenteLa variable contiene "", una ruta de archivo (en lugar del contenido del archivo), un bloque JSON o un certificado cuando se esperaba solo una clave. Todo lo que no sea material de clave PEM/DER acaba exactamente en este error.
Clase de clave incorrecta para la API
frecuentePasar un PEM de clave pública a createPrivateKey() falla con este mensaje: el decodificador busca una estructura de clave privada y no encuentra ninguna. Lo contrario no es un error: createPublicKey() acepta una clave privada y deriva la mitad pública.
Bytes DER sin metadatos de formato
ocasionalUn DER en bruto pasado como un simple Buffer se analiza como PEM de forma predeterminada. Sin { format: "der", type: "pkcs8" | "spki" | "sec1" }, el decodificador no puede saber qué estructura esperar.
Cómo solucionarlo
- 1.
Normalizar los PEM de las variables de entorno y comprobar la etiqueta
Restaura los saltos de línea e imprime la primera línea. Si la etiqueta dice PUBLIC KEY donde llamas a createPrivateKey, la variable apunta a la clave equivocada.
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.
Indicar DER explícitamente
Cuando la clave es DER binario (de un blob de una base de datos, de una conversión desde un JWKS o de protobuf), indica el formato y el tipo; el decodificador no lo adivina.
js import { createPrivateKey } from "node:crypto"; const key = createPrivateKey({ key: derBuffer, format: "der", type: "pkcs8", // or "sec1" for BEGIN EC PRIVATE KEY material }); - 3.
Comprobar el material fuera de Node
Deja que OpenSSL te diga qué son realmente los bytes. Si esto también falla, los propios datos están dañados: corrige el origen, no la llamada de Node.
bash openssl pkey -in key.pem -noout -text | head # for DER: openssl pkey -in key.der -inform der -noout -text | head