Criptografia ECDH + JWE usando nimbus-jose e Java 6
Estou com um problema e gostaria de saber se você pode me ajudar.
Preciso criar um JWE criptografado com curva elíptica.
estou usando
jre 1.6.0, nimbus-jose-jwt-8.20-jdk6.jar, bcprov-jdk15to18-166.jar.
Criei um armazenamento de chaves e um par de chaves com o algoritmo EC e a curva elíptica P-512. Se eu assinar o JWT com a chave privada e depois tentar validá-lo com a chave pública, tudo funciona bem, mas além de assinar, preciso criptografar para fazer um JWE em que a carga útil não seja vista.
Ao tentar criptografar o JWE com a chave pública, ele lança a seguinte Exceção
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)
este é o código que uso para criptografar:
//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);
Eu tenho as bibliotecas bem definidas no classpath do Eclipe.
Embora meus requisitos sejam criptografados em JWE com uma curva elíptica, criei um certificado de teste RSA e, dessa forma, consegui gerar um JWE criptografado com o referido certificado sem problemas.
Também usei um exemplo muito simples que eles colocaram no https://connect2id.com/products/nimbus-jose-jwt/examples/jws-with-ec-signaturepágina e também não funciona para mim. Ao criar o par de chaves, obtenho a mesma exceção.
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
}
}
}
A exceção NoClassDefFoundError indica que o carregador de classes responsável pelo carregamento dinâmico de classes não pode encontrar o arquivo .class para a classe que você está tentando usar, mas como eu disse antes, todas as minhas bibliotecas estão bem incluídas no classpath.
Será que estou faltando alguma Libéria para incluir? Não sei, estou perdida com esse problema
Respostas
O problema é que nimbus-jose-jwt-8.20-jdk6.jar não suporta a execução em Java 6, apesar da aparência de 'jdk6' em seu nome.
Você está recebendo o erro que está vendo porque o hashCode()método da classe KeyUse usa um método na java.util.Objectsclasse do utilitário e essa classe está disponível apenas do Java 7 em diante.
Eu recomendo fortemente a atualização do Java 6, para o Java 8, pelo menos. Isso certamente contornaria esse problema. No entanto, se você estiver travado com o Java 6, terá que entrar em contato com Connect2Id e pedir suporte.
Recebi uma resposta de connect2id me dizendo que era um problema como Luke disse, há coisas codificadas com Java 7 e este caso foi um deles. No final, tentando outras versões com nimbus-jose-jwt-6.8-jdk6.jar finalmente tudo funciona como eu queria.