Fehlermeldung
error:1E08010C:DECODER routines::unsupported
Reproduziert mit Node 26 / OpenSSL 3.x. Die OpenSSL-CLI gibt die lange Form aus: „error:1E08010C:DECODER routines:OSSL_DECODER_from_bio:unsupported“. Unter Node ≤16 (OpenSSL 1.1.1) führten dieselben Fehler zu anderen Meldungen.
Node.js crypto (OpenSSL 3) — code ERR_OSSL_UNSUPPORTED
Was der Fehler bedeutet
Der Decoder von OpenSSL 3 konnte das Schlüsselmaterial, das du an createPrivateKey(), createPublicKey(), sign() oder verify() übergeben hast, nicht parsen. Trotz des Worts „unsupported“ geht es fast nie um einen fehlenden Algorithmus: Die Bytes sind in keinem der Formate, die der Decoder probiert hat, ein lesbarer Schlüssel.
Warum der Fehler auftritt
PEM aus einer Umgebungsvariable mit wörtlichem \n
häufigSecrets-Manager und .env-Dateien liefern oft „-----BEGIN PRIVATE KEY-----\nMIG...“ mit Backslash-n als zwei Zeichen. OpenSSL sieht eine einzeilige Datei ohne gültigen PEM-Rahmen und gibt auf.
Leerer String oder Inhalt, der kein Schlüssel ist
häufigDie Variable enthält "", einen Dateipfad (statt des Dateiinhalts), einen JSON-Blob oder ein Zertifikat, obwohl ein reiner Schlüssel erwartet wurde. Alles, was kein Schlüsselmaterial in PEM/DER ist, landet bei genau diesem Fehler.
Falsche Schlüsselart für die API
häufigÜbergibst du einen öffentlichen Schlüssel als PEM an createPrivateKey(), scheitert der Aufruf mit dieser Meldung – der Decoder sucht eine Struktur für einen privaten Schlüssel und findet keine. Umgekehrt ist es kein Fehler: createPublicKey() akzeptiert einen privaten Schlüssel und leitet die öffentliche Hälfte ab.
DER-Bytes ohne Formatangaben
gelegentlichRohes DER, das als nackter Buffer übergeben wird, wird standardmäßig als PEM geparst. Ohne { format: "der", type: "pkcs8" | "spki" | "sec1" } kann der Decoder nicht wissen, welche Struktur er erwarten soll.
So behebst du den Fehler
- 1.
PEMs aus Umgebungsvariablen normalisieren und Label prüfen
Stelle die Zeilenumbrüche wieder her und gib die erste Zeile aus. Steht im Label PUBLIC KEY, wo du createPrivateKey aufrufst, ist die Variable mit dem falschen Schlüssel belegt.
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 ausdrücklich angeben
Liegt der Schlüssel als binäres DER vor (aus einem Datenbank-Blob, einer JWKS-Konvertierung oder Protobuf), gib Format und Typ an; der Decoder rät nicht.
js import { createPrivateKey } from "node:crypto"; const key = createPrivateKey({ key: derBuffer, format: "der", type: "pkcs8", // or "sec1" for BEGIN EC PRIVATE KEY material }); - 3.
Material außerhalb von Node prüfen
Lass dir von OpenSSL sagen, was die Bytes tatsächlich sind. Schlägt auch das fehl, sind die Daten selbst beschädigt – korrigiere die Quelle, nicht den Node-Aufruf.
bash openssl pkey -in key.pem -noout -text | head # for DER: openssl pkey -in key.der -inform der -noout -text | head