Перейти к содержимому
ecdsa.com
Node.js crypto (OpenSSL 3)Модуль crypto в Node.js

Сообщение об ошибке

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», дело почти никогда не в отсутствующем алгоритме: байты не читаются как ключ ни в одном формате, который попробовал декодер.

Почему это происходит

Как исправить

  1. 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. 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. 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

Связанные ошибки

Открыть всю базу ошибок подписей