web-dev-qa-db-fra.com

le fournisseur de bouncycastle ne peut pas trouver les classes nécessaires pour l'algorithme

J'essaie d'utiliser bouncycastle pour crypter un fichier à l'aide d'une clé publique. J'ai enregistré le fournisseur par programme:

Security.addProvider(new BouncyCastleProvider());

J'ai créé l'objet clé publique avec succès.

lorsque j'arrive à chiffrer le fichier à l'aide d'un PGPEncryptedDataGenerator et de la clé, j'obtiens une exception ClassNotFound.

Il semble que le fournisseur ne trouve pas cette classe au moment de l'exécution, bien que je sois certain d'avoir son pot ...

J'exécute mon application sur Tomcat. Utilisation de maven pour gérer les dépendances - les bocaux gonflables que je mets sont bcpg, bcprov, bcmail, bctsp. J'ai essayé d'utiliser les versions 1.4 et 1.6 sans succès. J'ai utilisé la "hiérarchie des dépendances" dans le plugin maven pour Eclipse et les exclusions dans le pom pour m'assurer qu'il n'y a pas plusieurs versions de bouncycastle dans mon projet.

Voici la trace de la pile:

org.bouncycastle.openpgp.PGPException: exception encrypting session key
        at org.bouncycastle.openpgp.PGPEncryptedDataGenerator.open(Unknown Source)
        at org.bouncycastle.openpgp.PGPEncryptedDataGenerator.open(Unknown Source)
.....(web application stack trace and uninteresting stuff).....
Caused by: Java.security.NoSuchAlgorithmException: No such algorithm: ElGamal/ECB/PKCS1Padding
        at javax.crypto.Cipher.getInstance(DashoA13*..)
        at org.bouncycastle.openpgp.PGPEncryptedDataGenerator$PubMethod.addSessionInfo(Unknown Source)
        ... 42 more
Caused by: Java.security.NoSuchAlgorithmException: class configured for Cipher(provider: BC)cannot be found.
        at Java.security.Provider$Service.getImplClass(Provider.Java:1268)
        at Java.security.Provider$Service.newInstance(Provider.Java:1220)
        ... 44 more
Caused by: Java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.JCEElGamalCipher$NoPadding
        at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1676)
        at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1521)
        at Java.security.Provider$Service.getImplClass(Provider.Java:1262)
21
Sam

Vous avez un problème d'installation avec le fournisseur de sécurité BouncyCastle, vous devez soit

  • Ajouter BouncyCastle au JRE/JDK $Java_HOME/jre/lib/security/Java.security fichier en tant que fournisseur (assurez-vous de l'ajouter au JRE que vous utilisez lors de l'exécution, par exemple si vous avez plusieurs JRE/JDK installés)

par exemple.

security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider

(et renumérotez les fournisseurs de sécurité en dessous - ne le mettez pas comme fournisseur de priorité la plus élevée).

  • ou vous pouvez ajouter BouncyCastle par programme, comme vous essayez de le faire ci-dessus, mais dans ce cas, la politique de sécurité $Java_HOME/jre/lib/security/Java.policy doit être "illimité" (vous pouvez probablement télécharger un fichier de politique illimité depuis la page d'accueil Java).
20
egbokul

Dans mon cas, cela a bien fonctionné une fois, mais plus tard, j'ai eu ClassNotFoundException en essayant d'utiliser BC. J'ai redémarré Tomcat, puis cela a bien fonctionné.

Je pense que si vous redéployez l'application, comme vous le faites souvent lors du développement, elle cesse de fonctionner. JNI est une autre chose qui souffre de ce problème.

Dans notre cas, ce n'est pas un problème. Nous ne nous redéployons jamais sur les systèmes de test et de production. Je préfère expédier le pot avec l'application plutôt que de le copier manuellement dans le répertoire lib du conteneur.

7
Sarel Botha

Vous devez ajouter le fichier javapns.jar et bcprove-jdk15on-1.47.jar dans votre dossier lib

import javapns.Push;

import org.Apache.log4j.BasicConfigurator;

public class SendPushNotification {

  public static void main(String[] args) {

    try {

        BasicConfigurator.configure();
        Push.alert("Hello World!", "Cetificate.p12", "password", false,
                "mydeviceToken");

    } catch (Exception e) {
        System.out.println(e);
    }

   }

}
2
RamChandra Bhakar