Fehlermeldung
java.lang.IllegalArgumentException: Illegal base64 character 2d
Auch ausgegeben als
- java.lang.IllegalArgumentException: Illegal base64 character a
- java.lang.IllegalArgumentException: Illegal base64 character d
- java.lang.IllegalArgumentException: Illegal base64 character 5f
- java.lang.IllegalArgumentException: Illegal base64 character 20
Der Hexwert bezeichnet das störende Zeichen: `2d` „-“, `5f` „_“, `a` LF, `d` CR, `20` Leerzeichen.
Java (JDK) — java.util.Base64.Decoder.decode
Was der Fehler bedeutet
`Base64.getDecoder()` ist der strikte Decoder nach RFC 4648: Er akzeptiert nur `A–Z a–z 0–9 + /` sowie `=` als Padding und bricht beim ersten anderen Zeichen ab. Die Hexzahl ist der Code dieses Zeichens: `2d` ist `-` (die Bindestriche von `-----BEGIN …-----` oder aus dem base64url-Alphabet), `a` ist ein Zeilenvorschub, `d` ein Wagenrücklauf, `20` ein Leerzeichen, `5f` ein Unterstrich. Die Daten selbst sind meist in Ordnung – sie stecken nur in einer anderen Textverpackung, als der Decoder erwartet.
Warum der Fehler auftritt
PEM-Header und -Footer wurden nicht entfernt (2d)
häufigBeim Dekodieren der ganzen PEM-Datei stößt der Decoder auf das erste `-` von `-----BEGIN`. Nur der Inhalt zwischen den Rahmenzeilen ist base64.
Zeilenumbrüche im Inhalt (a oder d)
häufigPEM bricht base64 nach 64 Zeichen um. Der Basic-Decoder lehnt den Zeilenumbruch ab; unter Windows bearbeitete Dateien fügen zusätzlich `\r` hinzu.
base64url-Daten im Basic-Decoder (2d oder 5f)
häufigJWT-Segmente und JWK-Koordinaten verwenden `-` und `_` statt `+` und `/`. Für sie brauchst du `Base64.getUrlDecoder()`.
Leerzeichen oder Anführungszeichen aus der Konfiguration (20, 22)
gelegentlichSchlüssel, die in YAML, Properties-Dateien oder Umgebungsvariablen eingefügt werden, können Leerzeichen, Anführungszeichen oder maskierte Sequenzen `\n` aufnehmen.
So behebst du den Fehler
- 1.
Rahmenzeilen entfernen und MIME-Decoder verwenden
`Base64.getMimeDecoder()` überspringt Zeilentrenner – genau das, was der Inhalt von PEM-Blöcken braucht.
java String body = pem.replaceAll("-----(BEGIN|END) [A-Z ]+-----", ""); byte[] der = Base64.getMimeDecoder().decode(body); // ignores line separators and other non-alphabet characters - 2.
URL-Decoder für JOSE-Daten verwenden
Alles in einem JWT und in einem JWK ist base64url; der URL-Decoder akzeptiert auch das fehlende Padding.
java // JWT segments and JWK fields ("x", "y", "n", "e") use base64url without padding. byte[] header = Base64.getUrlDecoder().decode(jwt.split("\\.")[0]); byte[] x = Base64.getUrlDecoder().decode(jwk.get("x"));