web-dev-qa-db-ja.com

BouncyCastleのインストールの問題

BouncyCastleをWindowsのセキュリティプロバイダーとして追加しようとしていますXP Proなので、これを使用して、手順に従ってAndroidアプリケーションにいくつかの証明書を追加できます- ここ 。残念ながら、プロバイダーを追加することはできません。

私がした:

  1. プロバイダーをC:\Program Files\Java\jre6\lib\ext\にダウンロードしました。
  2. C:\Program Files\Java\jre6\lib\ext\bcprov-jdk16-146.jar%CLASSPATH%に追加しました。
  3. Java.securityにsecurity.provider.7=org.bouncycastle.jce.provider.BouncyCastleProviderを追加しました(7は順序の次のintです)。

私が走るとき:

keytool -import -v -trustcacerts -alias 0 -file mycert.crt -keystore mystore.bks -storetype BKS -providerName org.bouncycastle.jce.provider.BouncyCastleProvider -storepass mypassword 

次のエラーメッセージが表示されます。

keytool error: Java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider

また、動的に追加してみました。

import Java.security.Provider;
import Java.security.Security;
import Java.util.Enumeration;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class BouncyCastleMain {

    public static void main(String[] args) throws Exception {
        Security.addProvider(new BouncyCastleProvider()); // add it
        try { // list them out
            Provider p[] = Security.getProviders();
            for (int i = 0; i < p.length; i++) {
                System.out.println(p[i]);
                for (Enumeration<?> e = p[i].keys(); e.hasMoreElements();)
                    System.out.println("\t" + e.nextElement());
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

最初はJavaクラスをコンパイルするときにアクセスエラーが発生しましたが、提案に従って警告に変更しました ここ 。コードを実行すると、BouncyCastleが表示されます。プロバイダーのリストですが、プログラムが完了した後も残りません。

私はそれが実行可能でなければならないと確信していますが、それを使用してkeytoolを実行するのに十分な時間この男をインストールする方法に悩まされています。 Java APIを介してkeytoolを実行することは可能ですか、それともプロバイダーを固執させるいくつかのステップを見逃した可能性がありますか?

ありがとう!

18
Ginger McMurray

-providerNameオプションには、クラス名ではなく、プロバイダー名(この場合は "BC")が必要です。別のオプションである-providerClassにはクラス名が必要であり、プロバイダーがJava.securityファイルに登録されていない場合に役立ちます。

プロバイダーを「プログラム的に」登録する場合、それは一時的なものにすぎません。プログラムは、実行するたびにプロバイダーを再登録する必要があります。 BouncyCastleをkeytoolで利用できるようにすることが目標である場合、このアプローチを使用することはできません。

プロバイダーは既にインストールされているため(アーカイブをlib/extに配置し、Java.securityにリストすることにより)、-providerName BCオプションを使用するのがおそらく最も簡単な解決策です。または、-providerClass org.bouncycastle.jce.provider.BouncyCastleProviderオプションを使用することもできます。

ちなみに、CLASSPATH環境変数は使用しないでください。 lib/extのライブラリはすでにクラスパス上にあります。

オプションを修正した後もNoSuchProviderException-providerNameを使用)またはClassNotFoundException-providerClassを使用)が表示される場合は、の正しいコピーを使用していることを確認してください。 keytool。つまり、実行時に、keytool変数に依存するのではなく、PATHのフルパスを指定します。パスがBouncyCastleがインストールされたJREを参照していることを確認してください。システムに複数のJREとJDKがあることは珍しいことではありません。

25
erickson

Windowsを使用している場合は、管理者としてコマンドラインを起動してkeytoolコマンドを入力することを忘れないでください。