web-dev-qa-db-ja.com

bouncycastleプロバイダーがアルゴリズムに必要なクラスを見つけることができません

Bouncycastleを使用して、公開鍵を使用してファイルを暗号化しようとしています。プログラムでプロバイダーを登録しました:

Security.addProvider(new BouncyCastleProvider());

公開鍵オブジェクトを作成しました。

pGPEncryptedDataGeneratorとキーを使用してファイルを暗号化すると、ClassNotFound例外が発生します。

プロバイダーは実行時にこのクラスを見つけることができないようですが、確かに私はそのjarを持っています...

Tomcatでアプリを実行しています。 Mavenを使用して依存関係を処理する-私が置いた弾力のある城のjarは、bcpg、bcprov、bcmail、bctspです。 1.4と1.6の両方のバージョンを試しましたが、成功しませんでした。私は、Eclipseの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)
21
Sam

BouncyCastle Securityプロバイダーのインストールに問題がある場合は、次のいずれかを行う必要があります。

  • BouncyCastleをJRE/JDKに追加する$Java_HOME/jre/lib/security/Java.securityプロバイダーとしてのファイル(複数のJRE/JDKがインストールされている場合など、実行時に使用するJREに必ず追加してください)

例えば。

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

(そして、その下にあるセキュリティプロバイダーの番号を付け直します-最も優先度の高いプロバイダーとして配置しないでください)。

  • または、上記のようにプログラムでBouncyCastleをプログラムで追加できますが、この場合はセキュリティポリシー$Java_HOME/jre/lib/security/Java.policyは「無制限」である必要があります(おそらく無制限のポリシーファイルをJavaホームページからダウンロードできます)。
20
egbokul

私の場合、一度はうまくいきましたが、その後、BCを使用しようとするとClassNotFoundExceptionが発生しました。 Tomcatを再起動したところ、問題なく動作しました。

開発中に頻繁に行うようにアプリを再デプロイすると、機能しなくなると思います。 JNIはこの問題に悩まされているもう1つの問題です。

私たちの場合、これは問題ではありません。テストシステムと運用システムに再展開することはありません。 jarをコンテナーのlibディレクトリーに手動でコピーする代わりに、jarをアプリと一緒に出荷することを好みます。

7
Sarel Botha

Libフォルダーにjavapns.jarおよびbcprove-jdk15on-1.47.jarファイルを追加する必要があります

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);
    }

   }

}
2