You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot解析JWT公钥报Illegal base64 character 2d问题排查

问题根因

抛出java.lang.IllegalArgumentException: Illegal base64 character 2d的核心原因是传入Base64解码器的字符串包含非法字符:

  • 十六进制0x2d对应ASCII字符-,正是PEM格式公钥的头尾标记(-----BEGIN PUBLIC KEY-----、-----END PUBLIC KEY-----)中的连字符
  • 读取到的publicKey变量是完整的PEM格式公钥,除了头尾标记,还包含换行、前置缩进等非Base64字符,JDK默认的Base64.getDecoder()只支持解码纯Base64内容,遇到上述非法字符就会直接抛出异常。
修复方案

任选以下一种方案即可解决问题:

  • 方案1:代码侧预处理PEM内容
    在执行Base64解码前,先剔除PEM格式的头尾标记、所有空白字符(换行、空格、缩进),仅保留纯Base64编码段再做解码,修正后的代码如下:
    @Value("${jwt.publicKey}")
    private String publicKey;
    
    public Claims decodeJWT(String jwt) {
        KeyFactory kf;
        PublicKey key;
        try{
            // 清理PEM格式冗余内容
            String purePublicKey = publicKey
                    .replace("-----BEGIN PUBLIC KEY-----", "")
                    .replace("-----END PUBLIC KEY-----", "")
                    .replaceAll("\\s+", "");
            kf = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(purePublicKey));
            key = kf.generatePublic(keySpec);
        } catch (Exception e) {
            throw new RuntimeException("Failed to generate Public Key", e);
        }
    
        return Jwts.parser()
                .setSigningKey(key)
                .parseClaimsJws(jwt).getBody();
    }
    
  • 方案2:配置文件仅存储纯Base64公钥
    修改application.properties中的公钥配置,删除头尾标记、多余缩进和换行,只保留纯Base64编码字符串:
    jwt.publicKey=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAilGFaGPnAThX75U5w3kdl+McOglx+wSckiBgvgomO8PkwFX3g8YaKoIsKl4FnBab5o3gylg1X0NEqdadzY/V4SxCN1ED2y4i55BbHQ2eVAP2fNdsn0kB7GHxJsIu0hlaZSfjO7W9qtOExB4Y9LUx4UxGckRZFoF8zdtG9gDWgFdRxrWDZ6hfsKTm3aAOhL4GpCafGDiwedM9S6f6HWGJBSg+aBFWtafebnei1IRNtnRBvZWND3Etj3K9nqOOwrTs8o9f3fIx5NUd4bHkBBpFE0IXpkiZKCeLQ3kaEttWwnqUSE2WZKIPfoCc6PNVXX3FVkOJOO5/MPl/RtoOnkqR4wIDAQAB
    
    该方案不需要修改原有解码逻辑,缺点是配置的可读性略低于完整PEM格式。

内容的提问来源于stack exchange,提问作者Kris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:27:27