3

我有一个问题,我想知道你是否可以帮助我。

我需要用椭圆曲线创建一个加密的 JWE。

我在用

jre 1.6.0、nimbus-jose-jwt-8.20-jdk6.jar、bcprov-jdk15to18-166.jar。

我用 EC 算法和椭圆曲线 P-512 创建了一个密钥库和一个密钥对。如果我使用私钥对 JWT 进行签名,然后尝试使用公钥对其进行验证,一切正常,但除了签名之外,我还需要加密以创建一个看不到有效负载的 JWE。

当尝试使用公钥加密 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);

我在 ecipe 类路径中定义了库。

虽然我的要求是用椭圆曲线加密 JWE,但我创建了一个测试证书 RSA,通过这种方式,我能够毫无问题地生成一个带有所述证书的加密 JWE。

我还使用了他们放在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 文件,但正如我之前所说,我的所有库都很好地包含在类路径中。

难道是我错过了一些要包括的利比里亚吗?我不知道,我迷失了这个问题

4

2 回答 2

2

问题是 nimbus-jose-jwt-8.20-jdk6.jar 不支持在 Java 6 上运行,尽管其名称中出现了“jdk6”。

您收到您所看到的错误,因为KeyUse类的方法使用实用程序类中的方法hashCode(),并且该类仅从 Java 7 开始可用。java.util.Objects

强烈建议至少从 Java 6 升级到 Java 8。这样做肯定会解决这个问题。但是,如果您坚持使用 Java 6,则必须与 Connect2Id 联系并寻求他们的支持。

于 2020-09-05T12:34:10.943 回答
1

我收到了来自 connect2id 的回复,告诉我这是 Luke 所说的问题,有些东西是用 Java 7 编码的,这个案例就是其中之一。最后尝试使用 nimbus-jose-jwt-6.8-jdk6.jar 的其他版本最终一切都按我的意愿工作。

于 2020-09-06T01:32:17.943 回答