1

現在、BouncyCastleを機能させるのにいくつかの問題があります。これを数日間検索しているので、役立つ洞察を提供していただければ幸いです。

これがセットアップです。AndroidクライアントはRESTプロトコルを使用して、POSTメッセージをサーバーに送信します。これらのメッセージを表すクラスを使用して別のプロジェクトを作成したので、これをクライアントとサーバーの両方にライブラリとして含めることができます。メッセージオブジェクトは最初にJSON文字列に解析され、その後サーバーで解釈されます。

データの整合性を保つために、メッセージにはデジタル署名(DSA)が含まれています。公開鍵の交換については、先ほどこの問題について質問しました。これは正しく機能しているように見えるので、私が得た答えは役に立ちました。

ただし、検証は失敗し続けます。他のスレッドでのNikolayElenkovの回答は、考えられる原因について述べています。「ところで、単一のプロバイダーを扱っている方がおそらく簡単なので、サーバーでもBouncyCastleを使用することをお勧めします。」これは私が問題を抱えているところです(そしてそれは一種の別の問題なので、私はこれのために新しいトピックを作りました)

メッセージクラス(共通ライブラリから)からのコードの抜粋は次のとおりです。

import org.bouncycastle.jce.provider.BouncyCastleProvider;

// ....

private byte[] signature;

// ....

public void sign(DSAPrivateKey key) throws Exception {
    Security.addProvider(new BouncyCastleProvider());
    Signature signer = Signature.getInstance("SHA1withDSA");
    signer.initSign(key);
    signer.update(this.toByteArray());
    this.signature = signer.sign();
}

public boolean verifySignature(DSAPublicKey key) throws Exception {
    Security.addProvider(new BouncyCastleProvider());
    Signature signer = Signature.getInstance("SHA1withDSA");
    signer.initVerify(key);
    signer.update(this.toByteArray());
    return (signer.verify(this.signature));
}

bcprov-jdk15on-147.jarを各プロジェクトのクラスパスに含めました:クライアント(必要だとは思わないが、誰が知っているか)、プロトコルプロジェクト、およびサーバープロジェクト。

BouncyCastleによく見られる例外が発生しているため、サーバーはこれを処理できないようです。

java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getConstructor0(Class.java:2699)
at java.lang.Class.getDeclaredConstructor(Class.java:1985)
at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:82)
at com.google.gson.internal.ConstructorConstructor.getConstructor(ConstructorConstructor.java:66)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:71)
at com.google.gson.Gson.getAdapter(Gson.java:353)
at com.google.gson.Gson.fromJson(Gson.java:754)

次の行は、メッセージクラスのgson.fromJson()呼び出しです。

最後に言及しなければならないのは、ApacheFelixサーバーを搭載したMacOSXで作業しているということです。プロジェクトが終了した場合、サーバーモジュールは別のマシンに簡単に移植できる必要があります。

それで、私はどこで間違っているのですか?すでに助けてくれてありがとう。

4

2 に答える 2

0

Apache Felix のクラス ロードがどのように機能するかはわかりませんが、プロバイダーを複数回追加することは想定されていません。その部分を静的初期化子に移動するSecurity.addProvider(new BouncyCastleProvider());か、弾む城をjava.securityJDK のファイルに登録します。

例外が発生しているクラスは何ですか? デフォルトのコンストラクターで JCE コードを呼び出すのはなぜですか? 特に Gson が提供する自動マーシャリングを使用する場合は、これはおそらく悪い考えです。最初にオブジェクトを構築し、持っている検証コードを呼び出します。

于 2012-05-15T13:26:52.807 に答える
0

Apache Felix は OSGi 環境です。したがって、正しい方法は、必要な BouncyCastle パッケージを依存関係としてバンドルに追加し、BouncyCastle JAR をバンドルとしてインストールすることです。

約 1 年ほど前から、BouncyCastle JAR ファイルはすでに適切なバンドルになっています。必要なデータはすべて MANIFEST.MF に含まれています。

于 2012-05-15T14:20:02.273 に答える