【发布时间】:2021-05-23 18:30:18
【问题描述】:
我有一个 Java Spring 应用程序,我试图在其中创建 JWT 令牌,但我收到以下错误:
java.security.InvalidKeyException: IOException : DerInputStream.getLength(): lengthTag=111, too big.
代码如下:
public static String createJwt(String publicKey, String privateKey, String issuer, String userId) throws AuthenticationException {
try {
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) getPrivateKey(privateKey);
RSAPublicKey rsaPublicKey = (RSAPublicKey) getPublicKey(publicKey);
Algorithm algorithm = Algorithm.RSA256(rsaPublicKey, rsaPrivateKey);
long now = System.currentTimeMillis();
return JWT.create()
.withIssuer(issuer)
.withJWTId(userId)
.withIssuedAt(new Date(now))
.withExpiresAt(new Date(now + 15 * 60 * 1000))
.sign(algorithm);
} catch (JWTCreationException e) {
log.error("Jwt secure token creation failed. Exception: ", e);
throw new AuthenticationException("JWT creation failed");
}
}
private static PublicKey getPublicKey(String base64Key) {
byte[] rawKey = Base64.decodeBase64(base64Key);
X509EncodedKeySpec ks = new X509EncodedKeySpec(rawKey);
KeyFactory kf;
try {
kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(ks);
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
throw new WebApplicationException("Client Configuration issue. Public key error", Response.Status.SERVICE_UNAVAILABLE);
}
}
private static PrivateKey getPrivateKey(String base64Key) {
byte[] rawKey = Base64.decodeBase64(base64Key);
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(rawKey);
KeyFactory kf;
try {
kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(ks);
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
throw new WebApplicationException("Client Configuration issue. Private key error", Response.Status.SERVICE_UNAVAILABLE);
}
}
错误在以下行被抛出:kf.generatePublic(ks) 和 kf.generatePrivate(ks)。
我正在使用 512 位 RSA 密钥 (https://csfieldguide.org.nz/en/interactives/rsa-key-generator/)
-----BEGIN PRIVATE KEY-----
MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAlU2XVqKMxVkkBGM/
C/fTpAIe2oCSDGxRcAyEUsyO8N0LVJOGv3cGK6C4eoaPxvmPaMDBagYe2CcEGnaY
06l4kwIDAQABAkAHnj3qncCxEStVTfsZkTurUrBgVc8d8yj0nq7hyq5Ae/I77SKj
ZwDfberj+KDX185w9ehNmf93fkiBXtIiJd0BAiEA/5saOhZUxh7OveLugHdwHNOY
R1B/3T6vc4kXMWeYf4kCIQCViIbiDg+MuZ73/3B+vR0tUXTva2pO9YFdJj9J82p0
OwIgJcHyqNv9n9qTLaelFaMPE6MKHpa8nKES5907aNflxgkCIHI8/28r9s038i7c
w4DP0b6RgJh4o5r3DIGxeqBwil+JAiBDeBJgON+HvDP8ab5SAyPDBA+/WTTLdSag
X6vUH20ANw==
-----END PRIVATE KEY-----
和
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJVNl1aijMVZJARjPwv306QCHtqAkgxs
UXAMhFLMjvDdC1SThr93BiuguHqGj8b5j2jAwWoGHtgnBBp2mNOpeJMCAwEAAQ==
-----END PUBLIC KEY-----
传递给createJwt函数。
我做错了什么?
【问题讨论】:
标签: java spring-boot jwt