le fournisseur bouncycastle ne peut pas trouver les classes nécessaires à l’algorithme

J’essaie d’utiliser Bouncycastle pour chiffrer un fichier à l’aide d’une clé publique. J’ai enregistré le fournisseur par programme:

Security.addProvider(new BouncyCastleProvider()); 

J’ai créé l’object clé publique avec succès.

quand je parviens à chiffrer le fichier à l’aide d’un PGPEncryptedDataGenerator et de la clé, j’obtiens une exception ClassNotFound.

Il semble que le fournisseur ne puisse pas trouver cette classe au moment de l’exécution, bien que je sache avec certitude que j’ai son bocal …

J’exécute mon application sur tomcat. Utiliser maven pour gérer les dépendances – les bocaux de château gonflables que j’ai mis 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 maven plugin pour eclipse et des exclusions dans le pom afin de m’assurer qu’il n’y avait pas plusieurs versions de bouncycastle dans mon projet.

C’est la trace de la stack:

 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) 

Vous avez un problème d’installation du fournisseur de sécurité BouncyCastle, vous devez soit:

  • Ajoutez BouncyCastle au fichier JRE / JDK $JAVA_HOME/jre/lib/security/java.security en tant que fournisseur (assurez-vous de l’append au JRE que vous utilisez lors de l’exécution, par exemple si plusieurs JRE / JDK sont 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 append BouncyCastle par programme, comme vous essayiez de le faire ci-dessus, mais dans ce cas, la politique de sécurité $JAVA_HOME/jre/lib/security/java.policy devrait être “illimitée” (vous pouvez probablement télécharger un fichier de politique illimité Page d’accueil Java).

Dans mon cas, cela a bien fonctionné une fois, mais plus tard, j’ai eu une exception ClassNotFoundException lorsque j’ai essayé d’utiliser BC. J’ai redémarré Tomcat et cela a bien fonctionné.

Je pense que si vous redéployez l’application, comme vous le faites souvent pendant le 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 redéployons jamais sur les systèmes de test et de production. Je préfère expédier le fichier jar avec l’application au lieu de le copier manuellement dans le répertoire lib du conteneur.

Vous devez append les fichiers 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(Ssortingng[] args) { try { BasicConfigurator.configure(); Push.alert("Hello World!", "Cetificate.p12", "password", false, "mydeviceToken"); } catch (Exception e) { System.out.println(e); } } }