我在用
jre 1.6.0,nimbus-jose-jwt-8.20-jdk6.jar,bcprov-jdk15to18-166.jar。
我用EC算法和椭圆曲线P-512创建了一个密钥库和一个密钥对。如果我使用私钥对JWT进行签名,然后尝试使用公钥对其进行验证,那么一切都可以正常工作,但是除了签名之外,我还需要进行加密,以生成一个看不到有效负载的JWE。
Exception in thread "main" java.lang.NoClassDefFoundError: java/util/Objects
at com.nimbusds.jose.jwk.KeyUse.hashCode(KeyUse.java:121)
at java.util.HashMap.put(Unknown Source)
at com.nimbusds.jose.jwk.KeyUseAndOpsConsistency.<clinit>(KeyUseAndOpsConsistency.java:43)
at com.nimbusds.jose.jwk.JWK.<init>(JWK.java:197)
at com.nimbusds.jose.jwk.ECKey.<init>(ECKey.java:706)
at com.nimbusds.jose.jwk.ECKey$Builder.build(ECKey.java:571)
at com.nimbusds.jose.crypto.ECDHEncrypter.encrypt(ECDHEncrypter.java:217)
at com.nimbusds.jose.JWEObject.encrypt(JWEObject.java:370)
at pruebasJwt.inicioJwt.main(inicioJwt.java:373)
//encriptar token
ECPublicKey publicKey = (ECPublicKey) certificadoBean.getPublicKey();
Payload payload = new Payload(signedJWT2);
JWEObject jwe = new JWEObject(jweHeader, payload);
jwe.encrypt(new ECDHEncrypter(publicKey)); //**This is where the exception occurs**
String jweString = jwe.serialize();
String tokenJwt = signedJWT2.serialize();
System.err.println(tokenJwt);
我还在https://connect2id.com/products/nimbus-jose-jwt/examples/jws-with-ec-signature页面上使用了一个非常简单的示例,它对我来说也不起作用。当创建密钥对时,我会得到相同的异常。
public class JweEC {
public static void main(String[] args) {
System.out.println("############ INICIO JWE FIRMADO CON CERTIFICADO CURVA ELIPTICA ##############");
System.out.println("soporta ES512" + JCASupport.isSupported(JWSAlgorithm.ES512));
//Proveedor de criptografica
Provider bc = BouncyCastleProviderSingleton.getInstance();
Security.addProvider(bc);
System.out.println("soporta ES512" + JCASupport.isSupported(JWSAlgorithm.ES512));
try {
ECKey ecJWK = new ECKeyGenerator(Curve.P_521)
.generate(); **This is where the exception occurs**
ECKey ecPublicJWK = ecJWK.toPublicJWK();
}catch (Exception e) {
// TODO: handle exception
}
}
}
NoClassDefFoundError异常表明负责动态类加载的类加载器找不到试图使用的类的。class文件,但是正如我前面所说的,我的所有库都包含在类路径中。
是不是我错过了一些利比里亚的例子?我不知道,我被这个问题搞糊涂了
问题是nimbus-jose-jwt-8.20-jdk6.jar不支持在Java6上运行,尽管它的名称中出现了'jdk6'。
之所以出现错误,是因为KeyUse类的hashcode()
方法使用了Java.util.Objects
实用程序类中的一个方法,而该类仅在Java7以后可用。
我强烈建议至少从Java6升级到Java8。这样做肯定能解决这个问题。但是,如果您使用Java6,则必须与Connect2Id联系并请求他们的支持。