Шифрование 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, наконец, все работает так, как я хотел.