How can I create a JWT with RSA256 algorithm and a private key?

yoo*_*oon 0 jwt

String prvKey = "-----BEGIN PRIVATE KEY-----\n"
        + "........\n"
        + "-----END PRIVATE KEY-----";
Jwts.builder()
        .setClaims(jwtClaim)
        .signWith(SignatureAlgorithm.RS256, prvKey)
        .compact();
Run Code Online (Sandbox Code Playgroud)

Running this Java code prints

java.lang.IllegalArgumentException: Base64-encoded key bytes may only be specified for HMAC signatures. If using RSA or Elliptic Curve, use the signWith(SignatureAlgorithm, Key) method instead.

当我将RS256更改为HS256签名时,令牌生成良好,但我的目标服务器只接受RS256签名令牌,所以我必须使用RS256。

错误日志对我没有帮助,因为我已经在使用signWith(SignatureAlgorithm, Key)方法了。

我该如何解决这个问题?

任何评论、链接都值得赞赏。

yoo*_*oon 5

java.lang.IllegalArgumentException:只能为 HMAC 签名指定 Base64 编码的密钥字节。如果使用 RSA 或椭圆曲线,请改用 signWith(SignatureAlgorithm, Key) 方法。

意味着我应该传递一个 Key 对象而不是 String 对象。

    prvKeyStr = prvKeyStr.replace("-----BEGIN PRIVATE KEY-----", "");
    prvKeyStr = prvKeyStr.replace("-----END PRIVATE KEY-----", "");
    prvKeyStr = prvKeyStr.replaceAll("\\s+","");

    byte [] prvKeyBytes = Base64.decode(prvKeyStr);
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(prvKeyBytes);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    PrivateKey prvKey = kf.generatePrivate(keySpec);


    return Jwts.builder()
        .setClaims(jwtClaim)
        .signWith(SignatureAlgorithm.RS256, prvKey)
        .compact();
Run Code Online (Sandbox Code Playgroud)

为我工作。