Fehlermeldung
InvalidAccessError: Unable to use this key to verify
Der Text oben ist die Formulierung von Node (sign liefert „Unable to use this key to sign“, ein Schlüssel eines anderen Algorithmus „Key algorithm mismatch“). Browser formulieren es anders – Chrome „key.usages does not permit this operation“, Firefox „A parameter or an operation is not supported by the underlying object“, Safari „CryptoKey doesn't support verification“ –, aber der DOMException-Name InvalidAccessError ist überall derselbe.
WebCrypto crypto.subtle.sign / verify — browsers & Node
Was der Fehler bedeutet
Das übergebene Schlüsselobjekt darf diese Operation nicht ausführen: Sein usages-Array enthält sie nicht, die Schlüsselklasse ist falsch (Prüfen mit einem privaten Schlüssel, Signieren mit einem öffentlichen), oder der Schlüssel gehört zu einem anderen Algorithmus als dem, den der Aufruf verlangt. Das Schlüsselmaterial kann völlig gültig sein – seine Berechtigungen oder seine Rolle sind es nicht.
Warum der Fehler auftritt
Die Operation fehlte beim Import in usages
häufigWebCrypto-Schlüssel folgen dem Least-Privilege-Prinzip: importKey(..., ["verify"]) erzeugt einen Schlüssel, der nur prüfen kann. Importierst du mit [] oder mit ["sign"] und rufst dann verify() auf, scheitert das hier – usages werden bei der Erzeugung festgelegt und lassen sich später nicht ergänzen.
Öffentliche und private Hälfte vertauscht
häufigsubtle.sign braucht den privaten Schlüssel, subtle.verify den öffentlichen Schlüssel. keyPair.publicKey an sign zu übergeben (oder privateKey an verify) ist ein Rollenfehler, den die API sofort ablehnt.
Der Algorithmus des Schlüssels passt nicht zu dem der Operation
gelegentlichEin ECDH-Schlüssel in einem ECDSA-Aufruf von sign (oder umgekehrt) scheitert selbst auf derselben Kurve – WebCrypto bindet Schlüssel an den Algorithmus, für den sie erzeugt wurden. Designs nach dem Muster „ein EC-Schlüssel für beides“ müssen das Material deshalb zweimal importieren.
So behebst du den Fehler
- 1.
Benötigte usages angeben
Führe beim Generieren oder Importieren jede vorgesehene Operation auf; erfüllt ein Schlüssel mehrere Rollen, importiere dasselbe Material erneut mit anderen usages.
js const keyPair = await crypto.subtle.generateKey( { name: "ECDSA", namedCurve: "P-256" }, true, ["sign", "verify"], // privateKey gets "sign", publicKey gets "verify" ); - 2.
Jedem Aufruf die richtige Hälfte übergeben
Sieh dir beim Debuggen key.type und key.usages an – sie geben genau an, was das Objekt darf.
js console.log(key.type, key.usages); // e.g. "public" ["verify"] const sig = await crypto.subtle.sign(alg, keyPair.privateKey, data); const ok = await crypto.subtle.verify(alg, keyPair.publicKey, sig, data);