Шифрование ECDH + JWE с использованием nimbus-jose и Java 6

У меня проблема, и я хотел бы знать, можете ли вы мне помочь.

Мне нужно создать зашифрованный JWE с эллиптической кривой.

Я использую

jre 1.6.0, нимбус-хосе-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);

У меня есть библиотеки, четко определенные в пути к классам eclipe.

Хотя мои требования - это 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 для класса, который вы пытаетесь использовать, но, как я уже сказал, все мои библиотеки хорошо включены в путь к классам.

Может быть, мне не хватает какой-то либерии, которую нужно включить? Я не знаю, я потерялся с этой проблемой

2 ответа

Проблема в том, что nimbus-jose-jwt-8.20-jdk6.jar не поддерживает запуск на Java 6, несмотря на появление "jdk6" в его имени.

Вы получаете сообщение об ошибке, потому что hashCode()метод класса KeyUse использует метод в java.util.Objects служебный класс, и этот класс доступен только начиная с Java 7.

Я настоятельно рекомендую перейти с Java 6, по крайней мере, на Java 8. Это наверняка решит эту проблему. Однако, если вы застряли на Java 6, вам придется связаться с Connect2Id и попросить их о поддержке.

Я получил ответ от connect2id, в котором говорилось, что это проблема, как сказал Люк, есть вещи, закодированные с помощью Java 7, и этот случай был одним из них. В конце концов, попробовал другие версии с nimbus-jose-jwt-6.8-jdk6.jar, наконец, все работает так, как я хотел.

Другие вопросы по тегам