【问题标题】:Issue creating JWT token创建 JWT 令牌的问题
【发布时间】: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


    【解决方案1】:

    我能够解决这个问题。从私钥和公钥中删除页眉和页脚,即:

    私钥:

    MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAlU2XVqKMxVkkBGM/
    C/fTpAIe2oCSDGxRcAyEUsyO8N0LVJOGv3cGK6C4eoaPxvmPaMDBagYe2CcEGnaY
    06l4kwIDAQABAkAHnj3qncCxEStVTfsZkTurUrBgVc8d8yj0nq7hyq5Ae/I77SKj
    ZwDfberj+KDX185w9ehNmf93fkiBXtIiJd0BAiEA/5saOhZUxh7OveLugHdwHNOY
    R1B/3T6vc4kXMWeYf4kCIQCViIbiDg+MuZ73/3B+vR0tUXTva2pO9YFdJj9J82p0
    OwIgJcHyqNv9n9qTLaelFaMPE6MKHpa8nKES5907aNflxgkCIHI8/28r9s038i7c
    w4DP0b6RgJh4o5r3DIGxeqBwil+JAiBDeBJgON+HvDP8ab5SAyPDBA+/WTTLdSag
    X6vUH20ANw==
    

    和公钥:

    MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJVNl1aijMVZJARjPwv306QCHtqAkgxs
    UXAMhFLMjvDdC1SThr93BiuguHqGj8b5j2jAwWoGHtgnBBp2mNOpeJMCAwEAAQ==
    

    希望这可以帮助其他面临此问题的人!

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 2019-07-28
      • 2018-03-01
      • 2018-04-13
      • 1970-01-01
      • 2020-10-20
      • 2019-12-08
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多