如何使用RSA512算法创建签名的JWT

时间:2019-07-10 13:51:09

标签: java spring-boot jwt jwt-auth

我正在尝试创建JWT(“ JOT”)令牌,以使我的api调用真实。每当我尝试使用RSA512签名创建令牌时,都会返回一条错误消息

  

java.lang.IllegalArgumentException:必须使用RSA私钥计算RSA签名。类型为javax.crypto.spec.SecretKeySpec的指定密钥不是RSA私钥。

我正在使用以下代码:

 SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.RS512;

 long nowMillis = System.currentTimeMillis();
  Date now = new Date(nowMillis);
 byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY);
 Key signingKey = new SecretKeySpec(apiKeySecretBytes, 
                signatureAlgorithm.getJcaName());

   JwtBuilder builder = Jwts.builder().claim("uuid", 
    id).setIssuedAt(now).setExpiration(new Date(600000))
    .signWith(signatureAlgorithm, signingKey);

当我尝试使用HS算法创建时,它会生成一个令牌,但是当我尝试在JWT.IO中对其进行验证时,它始终会显示无效的签名。

如何克服它以及如何生成签名的JWT?

1 个答案:

答案 0 :(得分:0)

最初,我没有将Base64编码的RSAkey再次编码为base64,这是我收到此错误的原因。

java.lang.IllegalArgumentException:必须使用RSA私钥计算RSA签名。类型为javax.crypto.spec.SecretKeySpec的指定密钥不是RSA私钥。

当我提供RSAKey base 64编码或字节码专用密钥时,我又回到了错误之下

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

每当我提供一个字符串/字节的私钥时,它总是在检查HMAC算法。参见JWTBuilder的以下代码。

@Override
public JwtBuilder signWith(SignatureAlgorithm alg, byte[] secretKey) {
    Assert.notNull(alg, "SignatureAlgorithm cannot be null.");
    Assert.notEmpty(secretKey, "secret key byte array cannot be null or empty.");
    Assert.isTrue(alg.isHmac(), "Key bytes may only be specified for HMAC signatures.  If using RSA or Elliptic Curve, use the signWith(SignatureAlgorithm, Key) method instead.");
    this.algorithm = alg;
    this.keyBytes = secretKey;
    return this;
}

@Override
public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) {
    Assert.hasText(base64EncodedSecretKey, "base64-encoded secret key cannot be null or empty.");
    Assert.isTrue(alg.isHmac(), "Base64-encoded key bytes may only be specified for HMAC signatures.  If using RSA or Elliptic Curve, use the signWith(SignatureAlgorithm, Key) method instead.");
    byte[] bytes = TextCodec.BASE64.decode(base64EncodedSecretKey);
    return signWith(alg, bytes);
}

@Override
public JwtBuilder signWith(SignatureAlgorithm alg, Key key) {
    Assert.notNull(alg, "SignatureAlgorithm cannot be null.");
    Assert.notNull(key, "Key argument cannot be null.");
    this.algorithm = alg;
    this.key = key;
    return this;
}

始终最好提供类型为java.security.key的私有密钥,并且必须是RSA密钥。我使用P12证书加载私钥。