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编码字符串:
该方案不需要修改原有解码逻辑,缺点是配置的可读性略低于完整PEM格式。jwt.publicKey=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAilGFaGPnAThX75U5w3kdl+McOglx+wSckiBgvgomO8PkwFX3g8YaKoIsKl4FnBab5o3gylg1X0NEqdadzY/V4SxCN1ED2y4i55BbHQ2eVAP2fNdsn0kB7GHxJsIu0hlaZSfjO7W9qtOExB4Y9LUx4UxGckRZFoF8zdtG9gDWgFdRxrWDZ6hfsKTm3aAOhL4GpCafGDiwedM9S6f6HWGJBSg+aBFWtafebnei1IRNtnRBvZWND3Etj3K9nqOOwrTs8o9f3fIx5NUd4bHkBBpFE0IXpkiZKCeLQ3kaEttWwnqUSE2WZKIPfoCc6PNVXX3FVkOJOO5/MPl/RtoOnkqR4wIDAQAB
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

