服务器端的BouncyCastle与Android手机作为客户端

我目前在让BouncyCastle工作时遇到一些困难。 现在正在搜索这几天,所以我希望你能提供任何有用的见解。

这是设置。 使用REST协议,Android客户端将POST消息发送到服务器。 我用表示这些消息的类创建了一个单独的项目,以便我可以将它作为库包含在客户端和服务器上。 消息对象首先被解析为JSON字符串,然后在服务器上进行解释。

为了数据完整性,消息包含数字签名(DSA)。 我之前就这个问题提出了一个关于公钥交换的问题。 我得到的答案很有帮助,因为这似乎正常。

但是,validation仍然失败。 Nikolay Elenkov在另一个post中的回答提到了一个可能的原因:“顺便说一句,如果你与一个提供商打交道可能会更容易,所以你可能也想在服务器上使用Bouncy Castle。” 这是我遇到麻烦的地方(因为这是一个不同的问题,我为此提出了一个新主题)

以下是来自消息类(来自公共库)的代码的摘录:

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) 

下一行是对message-class的gson.fromJson()调用。

最后我要提的是,我正在使用Apache Felix服务器在Mac OS X上工作。 如果项目完成,服务器模块应该可以轻松移植到另一台机器上。

那么,我哪里错了? 谢谢你的任何帮助。

我不知道Apache Felix的类加载是如何工作的,但是你不应该多次添加提供者。 移动Security.addProvider(new BouncyCastleProvider()); 部分到JDK的java.security文件中的静态初始化程序或寄存器弹性城堡。

发生了什么类exception? 为什么要在默认构造函数中调用JCE代码? 这可能是一个坏主意,尤其是当使用Gson提供的自动编组时。 首先构造您的对象,然后调用您拥有的任何validation码。

Apache Felix是一个OSGi环境。 因此,正确的方法是将必要的BouncyCastle包作为依赖项添加到您的包中,并将BouncyCastle JAR安装为Bundle。

由于大约一年左右的时间,BouncyCastle JAR文件已经是正确的捆绑包 – 它们已经在MANIFEST.MF中包含了所有必要的数据。