14

http://www.bouncycastle.org/wiki/display/JA1/Provider+Installationの手順に従って bouncycastle を追加し ます が、まだ 1 つの問題があります。アプリケーションを再デプロイすると、このプロバイダーが見つからないため、アプリケーションが例外をスローすることがあります。この問題は、100 回の再デプロイごとに 1 回 (おそらくそれ以下) 発生します。サーバー (weblogic) を再起動すると、再び機能し始めます。この問題が発生する理由についてアドバイスをいただければ幸いです

編集:

上記のリンクで両方の方法を使用しています。どちらか一方だけを使用すると機能しないため、このプロバイダーを java.security に追加し、クラスでこのプロバイダーを登録しました。

static {
    Security.addProvider(new BouncyCastleProvider());
}
4

3 に答える 3

26

あなたはおそらくNoClassDefFoundError. これは、JSSE 実装の既知の問題です。

シナリオは次のとおりです。

  • コンテナは、アプリケーション固有の ClassLoader で弾む城のクラスをロードします
  • 作成するプロバイダ インスタンスはそのクラスに依存し、その ClassLoader にも依存します。
  • 次に、最上位の JVM ClassLoader の静的フィールドのおかげで、プロバイダが JRE API に登録されます。
  • 再デプロイ時に、コンテナーはアプリケーションの ClassLoader を破棄して新しいものを作成します
  • アルゴリズムは既知であるため、2 番目のプロバイダーの挿入は暗黙のうちに失敗します。
  • アルゴリズムを使用する場合、ClassLoader が破棄されているため、プロバイダー インスタンスは単純に使用できません。
  • その後、唯一のオプションは、コンテナーを再起動して状況を修正することです。

アンデプロイ イベントの標準リスナーがないため、JSSE プロバイダーの削除をすぐにトリガーすることはできません。

この問題を回避するための推奨される方法は、JVM ClassPath またはコンテナー ClassPath に弾むキャッスル クラスを用意することです。アプリケーションから削除する必要があります。ここで、静的初期化子の代替オプションを使用して BC プロバイダーを登録する必要があります。WebLogic は、サーバーの起動時にコードをトリガーする方法を提供します(私はサーバーの起動クラスを使用しました)。このコードは、サーバー/JVM の有効期間全体にわたって JSSE プロバイダーを登録する役割を果たします。

java.security別のオプションは、弾む城の jar を含むJRE ファイルに次の行を追加するjre/lib/extことですが、更新時に失われる可能性があるため、この方法は好きではありません。security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider

そのため、アプリケーションは単に実装が存在することを期待します。アルゴリズムの可用性に関するテストを追加して、オペレーターやユーザーに問題を報告することをお勧めします。

于 2012-05-05T23:48:10.763 に答える
11

Tomcat でアプリケーションを再デプロイするために、この回避策を使用します。

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 を最初に削除して、再デプロイ後に再度使用する必要があることです。

于 2012-10-30T12:49:00.867 に答える