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)
Vous avez un problème d'installation avec le fournisseur de sécurité BouncyCastle, vous devez soit
$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).
$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).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.
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);
}
}
}