поставщик bouncycastle не может найти классы, необходимые для алгоритма - PullRequest
18 голосов
/ 02 августа 2011

Я пытаюсь использовать bouncycastle для шифрования файла с помощью открытого ключа. Я зарегистрировал провайдера программно:

Security.addProvider(new BouncyCastleProvider());

Я успешно создал объект открытого ключа.

при шифровании файла с использованием PGPEncryptedDataGenerator и ключа я получаю исключение ClassNotFound.

Кажется, провайдер не может найти этот класс во время выполнения, хотя я точно знаю, что у меня есть его jar ...

Я запускаю свое приложение на tomcat. Использование maven для обработки зависимостей - я ставлю jars надувные замки bcpg, bcprov, bcmail, bctsp. Я пытался использовать версии 1.4 и 1.6 без успеха. Я использовал «иерархию зависимостей» в плагине maven для затмения и исключений в pom, чтобы убедиться, что в моем проекте нет нескольких версий bouncycastle.

Это трассировка стека:

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)

Ответы [ 3 ]

16 голосов
/ 02 августа 2011

У вас есть проблема с установкой поставщика BouncyCastle Security, вам необходимо либо

  • Добавить BouncyCastle в файл JRE / JDK $JAVA_HOME/jre/lib/security/java.security в качестве поставщика (убедитесь, что вы добавляете его в JRE,используйте при работе, например, если у вас установлено несколько JRE / JDK)

например.

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

(и перенумеруйте провайдеров безопасности под ним - не ставьте это какпоставщик с наивысшим приоритетом).

  • или вы можете добавить BouncyCastle программным способом, как вы пытались сделать выше, но в этом случае политика безопасности $JAVA_HOME/jre/lib/security/java.policy должна быть «неограниченной» (вы можете скачатьфайл неограниченной политики с домашней страницы Java).
6 голосов
/ 25 ноября 2015

В моем случае это работало нормально один раз, но потом я получил ClassNotFoundException при попытке использовать BC.Я перезапустил Tomcat, и затем он заработал нормально.

Я думаю, что если вы повторно развернете приложение, как вы часто это делаете во время разработки, оно перестает работать.JNI - это еще одна проблема, которая страдает от этой проблемы.

В нашем случае это не проблема.Мы никогда не переносим тестовые и производственные системы.Я предпочитаю отправлять банку с приложением, а не копировать его вручную в каталог lib контейнера.

2 голосов
/ 26 ноября 2013

Вам необходимо добавить файл javapns.jar и bcprove-jdk15on-1.47.jar в папку 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);
    }

   }

}
...