crypto.subtle ist die Standardschnittstelle der Webplattform für Kryptografie. Dieselben Aufrufe – generateKey, importKey, sign, verify, exportKey – funktionieren in Chromium, Firefox und WebKit und in Server-Laufzeitumgebungen wie Node.js; damit ist die API die naheliegende Wahl für Code, der auf beiden Seiten laufen muss. Die API gibt es nur in sicheren Kontexten: Auf einer Seite über einfaches http ist crypto.subtle undefined.
Die Spezifikation legt das Format der ECDSA-Signatur auf rohes r‖s fest, auf P-256 also 64 Byte, und der Test fand genau das in allen vier Engines. Das passt zu JWS und JWT, ES256-Tokens brauchen also keine Konvertierung, aber nicht zu OpenSSL, SHA256withECDSA von Java, SignASN1 von Go oder node:crypto, die alle ASN.1-DER verwenden. Weil eine an verify() übergebene DER-Signatur schlicht false liefert statt eines Fehlers, sieht der Formatunterschied wie eine Fälschung aus; konvertiere mit dem Konverter DER ⇄ Raw oder prüfe beide Formen im Signatur-Verifizierer.
Die zweite häufige Hürde sind Schlüssel. importKey("spki") nimmt DER-Bytes entgegen, nie PEM-Text; "raw" nimmt den SEC1-Punkt, und die komprimierte Form akzeptieren Node.js, Chromium und Firefox, WebKit lehnt sie dagegen ab – sende für portablen Code also den unkomprimierten Punkt. Private Schlüssel lassen sich nur als PKCS#8-DER oder JWK importieren – die SEC1-Dateien EC PRIVATE KEY, die OpenSSL standardmäßig schreibt, musst du zuerst nach PKCS#8 konvertieren, etwa mit dem JWK-Konverter.
Die Liste der Kurven endet bei P-256, P-384 und P-521: secp256k1 und Brainpool lösen überall NotSupportedError aus, Bitcoin- und Ethereum-Schlüssel brauchen also eine Bibliothek wie @noble/curves. Ed25519 funktioniert in allen vier Engines, Ed448 nur in Node.js. Die Post-Quanten-Unterstützung ist uneinheitlich: Node.js 24.22 implementiert ML-DSA und ML-KEM mit einer Warnung, dass sie experimentell sind, Chromium 156 akzeptiert ML-DSA und ML-KEM-768/1024, aber nicht ML-KEM-512, und Firefox 157 und WebKit 27.2 bieten keines von beiden – prüfe die Verfügbarkeit per Feature-Detection, bevor du dich darauf verlässt, und probiere die Algorithmen im Playground für Post-Quanten-Signaturen aus.
Das Beispiel zeigt das portable Muster: Nenne den Hash im Algorithmusobjekt, importiere fremde PEM-Schlüssel, indem du sie zuerst zu DER dekodierst, und denk daran, dass die 64 Byte lange Ausgabe in DER verpackt werden muss, bevor ein Verifizierer im Stil von OpenSSL sie liest.