我正在构建一个 java spring boot auth 服务,该服务创建一个 jwt 和一个随后使用该 jwt 的资源服务。
因此我使用以下方法创建了公钥/私钥对:
keytool -genkeypair -alias myalias -keyalg RSA -keypass password1 -keystore myclient.jks -storepass password1
然后我使用以下方法导出公钥:
keytool -list -rfc --keystore myclient.jks | openssl x509 -inform pem -pubkey
之后我将公钥存储在资源服务器的application.properties文件中:
jwt.publicKey = -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAilGFaGPnAThX75U5w3kd
l+McOglx+wSckiBgvgomO8PkwFX3g8YaKoIsKl4FnBab5o3gylg1X0NEqdadzY/V
4SxCN1ED2y4i55BbHQ2eVAP2fNdsn0kB7GHxJsIu0hlaZSfjO7W9qtOExB4Y9LUx
4UxGckRZFoF8zdtG9gDWgFdRxrWDZ6hfsKTm3aAOhL4GpCafGDiwedM9S6f6HWGJ
BSg+aBFWtafebnei1IRNtnRBvZWND3Etj3K9nqOOwrTs8o9f3fIx5NUd4bHkBBpF
E0IXpkiZKCeLQ3kaEttWwnqUSE2WZKIPfoCc6PNVXX3FVkOJOO5/MPl/RtoOnkqR
4wIDAQAB
-----END PUBLIC KEY-----
但是当我尝试解码 JWT 时:
@Value("${jwt.publicKey}")
private String publicKey;
public Claims decodeJWT(String jwt) {
KeyFactory kf;
PublicKey key;
try{
kf = KeyFactory.getInstance("RSA");
X509EncodedKeySpec pubKeySpecX509EncodedKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));
key = kf.generatePublic(pubKeySpecX509EncodedKeySpec);
} catch (Exception e) {
throw new RuntimeException("Failed to generate Public Key", e);
}
//This line will throw an exception if it is not a signed JWS (as expected)
return Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(jwt).getBody();
}
我收到错误:
java.lang.IllegalArgumentException: Illegal base64 character 2d
有人能发现我在这里做错了什么吗?
干杯, 克里斯
我也遇到过这样的问题。我使用了以下命令,我的问题得到了解决。显然,这个问题是由于字符串中的减号字符引起的。
new String(Base64.getUrlDecoder().decode());