Fehlermeldung
Failed to read asymmetric key
Node.js crypto — e.g. code ERR_OSSL_ASN1_WRONG_TAG
Was der Fehler bedeutet
createPublicKey() – oder ein anderer Aufruf, der einen öffentlichen Schlüssel als DER entgegennimmt, etwa crypto.verify() – hat Bytes erhalten, deren ASN.1-Struktur nicht zum angegebenen Typ passt, zum Beispiel type: "spki", obwohl die Bytes tatsächlich ein privater EC-Schlüssel im SEC1-Format sind. OpenSSL hat weit genug geparst, um zu erkennen, dass die Tags falsch sind, und dann abgebrochen. (createPrivateKey() und PEM mit falschem Label melden dieselbe Art von Abweichung im Wortlaut von OpenSSL, etwa „error:068000A8:asn1 encoding routines::wrong tag“.) Der zugehörige Code (ERR_OSSL_ASN1_WRONG_TAG und verwandte Codes) benennt die Abweichung auf ASN.1-Ebene. Anders als der Fehler „unsupported“ der DECODER-Routinen, der bedeutet, dass überhaupt nichts Parsebares gefunden wurde, heißt dieser Fehler: Die Bytes hatten erkennbar die falsche Struktur für den angegebenen Typ.
Warum der Fehler auftritt
Angegebener Typ passt nicht zu den Bytes
häufigIn der DER-Welt gibt es mehrere Container: SPKI für öffentliche Schlüssel, PKCS#8 für private Schlüssel, SEC1 für ältere private EC-Schlüssel, PKCS#1 für älteres RSA. Gibst du type: "spki" für einen privaten Schlüssel in SEC1 oder PKCS#8 oder für ein ganzes Zertifikat an, schlägt die Tag-Prüfung sofort fehl.
Base64 nicht dekodiert oder doppelt dekodiert
häufigÜbergibst du base64-Text mit format: "der" (sodass OpenSSL ASCII als ASN.1 parst) oder wendest du Buffer.from(pem, "base64") auf ein vollständiges PEM samt Header-Zeilen an, entsteht in beiden Fällen Bytesalat mit falschen Tags.
Ein roher EC-Punkt statt einer Schlüsselstruktur
gelegentlichDie 65 Byte eines unkomprimierten Punkts (0x04‖X‖Y) sind kein DER – sie sind die Payload, die in einer SPKI-Struktur steckt. Übergibst du sie direkt an createPublicKey, schlägt das fehl; sie müssen erst verpackt oder über JWK oder den Raw-Import von WebCrypto importiert werden.
So behebst du den Fehler
- 1.
Struktur ermitteln, dann wahrheitsgemäß angeben
asn1parse gibt die äußere Struktur aus. Eine SPKI-Struktur beginnt mit einer SEQUENCE, die einen AlgorithmIdentifier enthält; PKCS#8 beginnt mit einer Version INTEGER 0; EC-Schlüssel im SEC1-Format mit INTEGER 1.
bash openssl asn1parse -inform der -in key.der | head -5 - 2.
Node-Optionen auf den Container abstimmen
Sobald du den Container kennst, ist die Zuordnung rein mechanisch.
js // SPKI public key createPublicKey({ key: der, format: "der", type: "spki" }); // PKCS#8 private key createPrivateKey({ key: der, format: "der", type: "pkcs8" }); // SEC1 (BEGIN EC PRIVATE KEY) private key createPrivateKey({ key: der, format: "der", type: "sec1" }); - 3.
Ältere Container einmal konvertieren, an der Systemgrenze
Speichere einheitlich PKCS#8/SPKI, damit Anwendungscode nie raten muss.
bash openssl pkey -in legacy-ec.pem -out key-pkcs8.pem # any private → PKCS#8 openssl pkey -in key-pkcs8.pem -pubout -out pub-spki.pem # derive SPKI public