本文へスキップ
ecdsa.com
Java (JDK)Java

エラーメッセージ

java.lang.IllegalArgumentException: Illegal base64 character 2d

別の表記

  • 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

16 進数の値は問題の文字を示します。`2d` は「-」、`5f` は「_」、`a` は LF、`d` は CR、`20` はスペースです。

Java (JDK) — java.util.Base64.Decoder.decode

このエラーの意味

`Base64.getDecoder()` は RFC 4648 に厳密に従うデコーダーで、`A–Z a–z 0–9 + /` と `=` によるパディングだけを受け付け、それ以外の文字が現れた時点で停止します。16 進数はその文字のコードです。`2d` は `-`(`-----BEGIN …-----` のダッシュ、または base64url のアルファベット)、`a` はラインフィード、`d` はキャリッジリターン、`20` はスペース、`5f` はアンダースコアです。通常、データ自体には問題がありません。デコーダーが想定しているのとは異なるテキスト形式で包まれているだけです。

発生する理由

修正方法

  1. 1.

    アーマーを取り除き、MIME デコーダーを使う

    `Base64.getMimeDecoder()` は行区切りを読み飛ばします。これはまさに PEM の本文に必要な動作です。

    java
    String body = pem.replaceAll("-----(BEGIN|END) [A-Z ]+-----", "");
    byte[] der = Base64.getMimeDecoder().decode(body); // ignores line separators and other non-alphabet characters
  2. 2.

    JOSE のデータには URL デコーダーを使う

    JWT と JWK に含まれるものはすべて base64url です。URL デコーダーは、パディングが省略されていても受け付けます。

    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"));

関連するエラー

署名エラーデータベースをすべて見る