Вопрос по java – Bouncycastle не может загрузить при повторном развертывании приложения

13

Я следую этой инструкции, чтобы добавить bouncycastle: http://www.bouncycastle.org/wiki/display/JA1/Provider+Installation но у меня есть еще одна проблема. Иногда при повторном развертывании приложения этот провайдер не обнаруживается, поэтому мое приложение выдает исключение. Эта проблема возникает только один раз на 100 повторных развертываний (возможно, меньше). Когда я перезагружаю свой сервер - weblogic, он снова начинает работать. Буду очень признателен за любые советы, почему возникает эта проблема

РЕДАКТИРОВАТЬ:

Я использую оба метода в ссылке выше, потому что, когда я использую только один из них, то это не работает Я добавляю в java.security этого провайдера, а затем в своем классе я зарегистрировал этого провайдера:

static {
    Security.addProvider(new BouncyCastleProvider());
}
Несколько соображений: проверьте возвращаемое значение из addProvider (), вызовите getProviders (), чтобы увидеть, есть ли оно там, если вы можете, установить точку останова на removeProvider (). Francis Upton
да, я пробую это сначала, и это работает только с тестом JUnit. Но когда я развертываю это приложение в weblogic, оно перестает работать, а затем я нашел ссылку выше и следую ему hudi
Ссылка, которую вы предоставили, дает два метода, которые вы используете? Francis Upton
их обоих я добавляю в java.security этого провайдера, а затем в своем классе я зарегистрировал этого провайдера: static {Security.addProvider (new BouncyCastleProvider ()); } hudi
Вы можете попробовать использовать только статический метод? Francis Upton

Ваш Ответ

3   ответа
0

Эта проблема может быть легко решена с помощью следующего кода и использования пакета sun.security.jce:

ProviderList list = Providers.getFullProviderList();
ProviderList.add(list, new BouncyCastleProvider());
Providers.beginThreadProviderList(list);

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

Providers.endThreadProviderList(this.oldList);
Error: User Rate Limit ExceededNo installed provider supports this key:Error: User Rate Limit Exceeded
10

t:

public class GenSignCastle {
    BouncyCastleProvider        bcProvider = null;

public GenSignCastle() {
    if ( bcProvider == null ) {
        bcProvider = new BouncyCastleProvider();
        Provider[] providers = Security.getProviders();

        String name = bcProvider.getName();
        Security.removeProvider( name ); // remove old instance

        Security.addProvider( bcProvider );
    }
}
.
.
.
}

Интересно, что я должен сначала удалить BouncyCastleProvider, чтобы использовать его снова после повторного развертывания.

Удаление поставщика BC в процессе завершения работы веб-приложения работало отлично!
22

NoClassDefFoundError, Это известная проблема с реализациями JSSE.

Вот сценарий:

Your container loads bouncy castle classes in an application specific ClassLoader The provider instance you create depends on that classes and so on that ClassLoader Then the provider is registered into JRE API thanks to static fields in top level JVM ClassLoader When redeploying, the container discards the application ClassLoader to create a new one As the algorithm is already known, the second provider insertion fails silently When using the algorithm the provider instance is simply unusable because the ClassLoader has been discarded Then the only option is to restart the container to get the situation fixed.

Поскольку нет стандартного прослушивателя для события отмены развертывания, невозможно инициировать удаление поставщика JSSE одновременно.

Рекомендуемый способ избежать этой проблемы - использовать классы надувных замков в JVM ClassPath или в контейнере ClassPath. Вы должны удалить его из своего приложения. Теперь вам нужно зарегистрировать провайдера BC с альтернативной опцией статического инициализатора. WebLogic предоставляетспособы запуска кода при запуске сервера (Я использовал класс запуска сервера), этот код будет отвечать за регистрацию провайдеров JSSE в течение всего срока службы сервера / JVM.

Альтернативный вариант - добавить следующую строку в JRE.java.security файл с надувным замком вjre/lib/ext но мне не нравится этот способ, потому что он может быть потерян при обновлении:security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider

Таким образом, приложение просто ожидает, что реализации есть, и, возможно, было бы неплохо добавить тесты на доступность алгоритма, чтобы сообщать о любых проблемах операторам и пользователям.

Error: User Rate Limit Exceededforums.oracle.com/forums/thread.jspa?threadID=2139251
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded hudi

Похожие вопросы