java io.jsonwebtoken.security.InvalidKeyException:RHEL 8上指定的密钥类型为sun.security.pkcs11.P11Key$P11PrivateKey

tv6aics1  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(298)

我正在尝试对JWT令牌进行签名,收到以下错误

io.jsonwebtoken.security.InvalidKeyException: JWT standard signing algorithms require either 1) a SecretKey for HMAC-SHA algorithms or 2) a private RSAKey for RSA algorithms or 3) a private ECKey for Elliptic Curve algorithms.  The specified key is of type sun.security.pkcs11.P11Key$P11PrivateKey

发生此错误的代码

public static String createJwtToken(Key privKey, String iss, String[] roles) {
        long nowMs = System.currentTimeMillis();
        long ttl = 60*60*1000; // 1 hour
        Date now = new Date(nowMs);
        Date exp = new Date(nowMs+ttl);
        return "Bearer " + Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .claim("roles", roles)
                .setIssuer(iss).setAudience("DRF")
                .setIssuedAt(now)
                .setExpiration(exp)
                .signWith(privKey)
                .compact();
    }

私钥是ECDSA密钥。从文件中读取字节,然后使用此代码创建PrivateKey对象

KeyFactory kf = KeyFactory.getInstance("EC");
     EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
     PrivateKey privateKey = kf.generatePrivate(keySpec);

在RHEL 7上使用Java 8没有问题。我已经升级到RHEL 8(没有其他更改),现在看到了问题。我也试过使用Java 11,没有任何变化。我用openjdk

yv5phkfx

yv5phkfx1#

仍然不确定是什么导致了这个问题,但它似乎与RHEL 8存储库中的Java构建隔离开来。使用其他openjdk构建可以像预期的那样工作。

相关问题