github.com/go-jose/go-jose/v4 (die Fortführung von Squares go-jose) implementiert JWS, JWE, JWK und JWT und taucht deshalb überall auf, wo Go-Dienste verschlüsselte oder signierte Tokens austauschen. In 4.1.6 funktionierten Signieren und Prüfen mit den Familien HS, RS, PS und ES sowie mit EdDSA; ES256K, Ed25519 und Ed448 erkennt die Bibliothek nicht als Algorithmusnamen.
Version 4 hat die Algorithmusliste zur Pflicht gemacht: jwt.ParseSigned(token, nil) scheitert mit no signature algorithms specified, ein Token lässt sich also nur mit Algorithmen parsen, die du selbst gewählt hast. Unsignierte Tokens lassen sich parsen, wenn none in dieser Liste steht, doch mit Claims(key) bestehen sie die Prüfung nie – lesen lässt sich ein solches Token nur über das ausdrücklich so benannte UnsafeClaimsWithoutVerification.
Die Prüfung läuft in zwei getrennten Schritten, und genau das ist die Falle. token.Claims(key, &claims) prüft die Signatur und füllt das Struct – es gab die Claims eines Tokens, das eine Stunde zuvor abgelaufen war, ohne jeden Fehler zurück. Ablaufzeit, Gültigkeitsbeginn (not-before), Aussteller und Audience prüft erst claims.Validate() mit einem Wert vom Typ jwt.Expected oder ValidateWithLeeway, und ein Token ohne exp besteht sogar das – prüfe also, ob Expiry gesetzt ist, wie es das Beispiel tut. Validate erlaubt jwt.DefaultLeeway, also eine Minute, was die Prüfung bestätigte.
Schlüssel sind typisiert. Ein HS256-Token mit dem PEM-Text als Schlüssel scheiterte am *ecdsa.PublicKey mit error in cryptographic primitive, bestand die Prüfung aber, als dieselben PEM-Bytes als Schlüssel übergeben wurden – verwende Schlüssel als geparste Go-Schlüssel, nicht als Bytes. ES256 lehnt einen P-384-Schlüssel mit expected 256 bit key, got 384 bits instead ab. Eine DER-kodierte ES256-Signatur scheitert mit demselben allgemeinen error in cryptographic primitive wie eine Fälschung; der JWT-Debugger zeigt die Länge der Signatur.
Bei verschlüsselten Tokens zeigt der JWE-Inspektor den Header und die Algorithmen; bei Schlüsselsätzen zeigt der JWKS-Checker, was ein Anbieter veröffentlicht, und der JWK-Konverter wandelt Schlüssel zwischen JWK und PEM um.