Сообщение об ошибке
error:1E08010C:DECODER routines::unsupported
Воспроизведено на Node 26 / OpenSSL 3.x. CLI OpenSSL выводит полную форму: «error:1E08010C:DECODER routines:OSSL_DECODER_from_bio:unsupported». В Node ≤16 (OpenSSL 1.1.1) те же ошибки давали другие сообщения.
Node.js crypto (OpenSSL 3) — code ERR_OSSL_UNSUPPORTED
Что это означает
Декодер OpenSSL 3 не смог разобрать ключевой материал, переданный в createPrivateKey(), createPublicKey(), sign() или verify(). Несмотря на слово «unsupported», дело почти никогда не в отсутствующем алгоритме: байты не читаются как ключ ни в одном формате, который попробовал декодер.
Почему это происходит
PEM из переменной окружения с буквальными \n
частоМенеджеры секретов и файлы .env часто отдают «-----BEGIN PRIVATE KEY-----\nMIG...», где обратная косая черта и n — два отдельных символа. OpenSSL видит однострочный файл без корректных строк-границ PEM и сдаётся.
Пустая строка или вовсе не ключ
частоВ переменной лежит "", путь к файлу (вместо его содержимого), фрагмент JSON или сертификат там, где ожидался просто ключ. Всё, кроме ключевого материала в PEM/DER, приводит именно к этой ошибке.
Не тот тип ключа для этого API
частоЕсли передать PEM открытого ключа в createPrivateKey(), появится это сообщение: декодер ищет структуру закрытого ключа и не находит её. Обратная ситуация — не ошибка: createPublicKey() принимает закрытый ключ и выводит из него открытую часть.
Байты DER без указания формата
иногдаГолый DER, переданный как простой Buffer, по умолчанию разбирается как PEM. Без { format: "der", type: "pkcs8" | "spki" | "sec1" } декодер не может знать, какую структуру ожидать.
Как исправить
- 1.
Нормализуйте PEM из переменных окружения и проверьте метку
Восстановите переводы строк и выведите первую строку. Если метка говорит, что это открытый ключ (PUBLIC KEY), а вы вызываете createPrivateKey, переменная указывает не на тот ключ.
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.
Явно указывайте DER
Если ключ — двоичный DER (из BLOB-поля базы данных, после преобразования JWKS или из protobuf), укажите формат и тип: декодер угадывать не будет.
js import { createPrivateKey } from "node:crypto"; const key = createPrivateKey({ key: derBuffer, format: "der", type: "pkcs8", // or "sec1" for BEGIN EC PRIVATE KEY material }); - 3.
Проверьте ключевой материал вне Node
Пусть OpenSSL скажет, что на самом деле содержат байты. Если и здесь ошибка, повреждены сами данные — исправляйте источник, а не вызов в Node.
bash openssl pkey -in key.pem -noout -text | head # for DER: openssl pkey -in key.der -inform der -noout -text | head