一,问题
在使用Base64解码的时候
// 这里的keyContent是公钥,一般配置到配置中心里,然后注入到容器里
String publicKeyString = keyContent
.replaceAll("\\n", "")
.replace("-----BEGIN PUBLIC KEY-----", "")
.replace("-----END PUBLIC KEY-----", "")
.trim();
byte[] keyBytes = Base64.getDecoder().decode(publicKeyString);
然后报错 java.lang.IllegalArgumentException: Illegal base64 character 20
java.lang.IllegalArgumentException: Illegal base64 character 20
at java.base/java.util.Base64$Decoder.decode0(Base64.java:848)
at java.base/java.util.Base64$Decoder.decode(Base64.java:566)
at java.base/java.util.Base64$Decoder.decode(Base64.java:589)
二,解决方法
问题原因是待解码的字符串(publicKeyString)中包含了多余的空格字符,需要替换掉。
其实可以看到前面我们已经做了一些替换工作,去掉多余的换行符,去掉前面的"-----BEGIN PUBLIC KEY-----",去掉后面的"-----END PUBLIC KEY-----"。一般情况下其实已经够了,不会有多余的空格。
但是,如果使用Apollo或者Nacos的时候,注入到Spring容器之后的这个字符串,可能还会多一些多余的空格,需要替换掉。
解决后的代码:
加上.replaceAll(" ","")
String publicKeyString = keyContent
.replaceAll("\\n", "")
.replace("-----BEGIN PUBLIC KEY-----", "")
.replace("-----END PUBLIC KEY-----", "")
.replaceAll(" ", "")
.trim();
byte[] keyBytes = Base64.getDecoder().decode(publicKeyString);
完美解决!