Crittografia ECDH + JWE utilizzando nimbus-jose e Java 6

Sep 05 2020

Ho un problema e vorrei sapere se potete aiutarmi.

Ho bisogno di creare un JWE crittografato con curva ellittica.

sto usando

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

Ho creato un keystore e una coppia di chiavi con l'algoritmo EC e la curva ellittica P-512. Se firmo il JWT con la chiave privata e poi provo a convalidarlo con la chiave pubblica tutto funziona bene, ma a parte la firma devo crittografare per creare un JWE in cui non si vede il payload.

Quando si tenta di crittografare il JWE con la chiave pubblica, viene generata la seguente eccezione

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)

questo è il codice che uso per crittografare:

        //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);

Ho le librerie ben definite nel percorso di classe eclipe.

Nonostante i miei requisiti siano JWE crittografati con una curva ellittica, ho creato un certificato di prova RSA e in questo modo sono stato in grado di generare un JWE crittografato con detto certificato senza problemi.

Ho anche usato un esempio molto semplice che hanno messo sulhttps://connect2id.com/products/nimbus-jose-jwt/examples/jws-with-ec-signaturepagina e non funziona neanche per me. Quando creo la coppia di chiavi ottengo la stessa eccezione.

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
        }

    }

}

L'eccezione NoClassDefFoundError indica che il caricatore di classi responsabile del caricamento dinamico delle classi non riesce a trovare il file .class per la classe che si sta tentando di utilizzare, ma come ho detto prima tutte le mie librerie sono ben incluse nel percorso di classe.

Potrebbe essere che mi manchi qualche liberia da includere? Non lo so, mi sono perso con questo problema

Risposte

1 LukeWoodward Sep 05 2020 at 19:34

Il problema è che nimbus-jose-jwt-8.20-jdk6.jar non supporta l'esecuzione su Java 6, nonostante l'apparizione di 'jdk6' nel suo nome.

Stai ricevendo l'errore che stai vedendo perché il hashCode()metodo della classe KeyUse utilizza un metodo nella java.util.Objectsclasse di utilità e questa classe è disponibile solo da Java 7 in poi.

Consiglio vivamente l'aggiornamento da Java 6, almeno a Java 8. In questo modo si aggirerebbe sicuramente questo problema. Tuttavia, se sei bloccato con Java 6, dovrai metterti in contatto con Connect2Id e chiedere loro supporto.

ramon Sep 06 2020 at 08:32

Ho ricevuto una risposta da connect2id che mi diceva che si trattava di un problema, come ha detto Luke, ci sono cose codificate con Java 7 e questo caso era uno di questi. Alla fine provando altre versioni con nimbus-jose-jwt-6.8-jdk6.jar finalmente tutto funziona come volevo.