Fehlermeldung
Invalid key object type public, expected private.
Die beiden Typnamen in der Meldung wechseln je nach Schlüssel und Operation: sign() mit einem geheimen Schlüssel meldet „Invalid key object type secret, expected private.“, verify() mit einem geheimen Schlüssel „Invalid key object type secret, expected private or public.“ Einen privaten Schlüssel akzeptiert verify() durchaus und prüft dann mit dessen öffentlicher Hälfte. Der Aufbau der Meldung bleibt gleich.
Node.js crypto — TypeError, code ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE
Was der Fehler bedeutet
Du hast ein KeyObject der falschen Art für die Operation übergeben: crypto.sign() braucht einen privaten Schlüssel, hat aber einen öffentlichen bekommen (oder verify() hat etwa einen geheimen Schlüssel bekommen). Die Schlüsselobjekte von Node kennen ihren eigenen Typ – öffentlich, privat oder geheim –, und jede API akzeptiert nur bestimmte Typen.
Warum der Fehler auftritt
Vertauschte Variablen an der Aufrufstelle
häufigpublicKey und privateKey beim Destructuring vertauscht oder ein Funktionsparameter namens key, der bekommt, was der Aufrufer gerade hatte. Mit dem öffentlichen Schlüssel zu signieren ist konstruktionsbedingt unmöglich, und Node meldet genau das, statt später auf rätselhafte Weise zu scheitern.
Das Laden hat einen anderen Typ ergeben als angenommen
häufigcreatePublicKey(privatePem) leitet absichtlich einen öffentlichen Schlüssel ab – Code, der das Ergebnis danach als privaten Schlüssel zum Signieren behandelt, scheitert hier. Ebenso wird eine PEM-Datei, die tatsächlich einen öffentlichen Schlüssel enthält, als Typ „public“ geladen, egal was der Dateiname sagt.
Geheimer (symmetrischer) Schlüssel in einer asymmetrischen API
gelegentlichDie Ausgabe von createSecretKey() (ein HMAC-/AES-Schlüssel) wird für ECDSA an sign/verify übergeben. Symmetrisches Schlüsselmaterial lässt sich für Public-Key-Signaturen nicht verwenden.
So behebst du den Fehler
- 1.
Schlüsseltypen an der Schnittstelle zusichern
KeyObject.type ist „public“ | „private“ | „secret“. Eine einzeilige Assertion macht aus einem verwirrenden Kryptofehler schon beim Laden einen offensichtlichen.
js import { createPrivateKey } from "node:crypto"; const signingKey = createPrivateKey(pem); if (signingKey.type !== "private") { throw new Error(`expected private key, got ${signingKey.type}`); } - 2.
Jede Hälfte des Paars für ihre eigene Operation verwenden
Der private Schlüssel signiert, der öffentliche prüft. Hast du nur einen privaten Schlüssel, leite die öffentliche Hälfte für die Prüfung ab, statt das private Objekt überall wiederzuverwenden.
js import { createPublicKey, sign, verify } from "node:crypto"; const signature = sign("sha256", data, privateKey); // private → sign const publicKey = createPublicKey(privateKey); // derive public half const ok = verify("sha256", data, publicKey, signature); // public → verify