Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务器端使用Android手机作为客户端的BouncyCastle_Java_Android_Security_Bouncycastle_Java Server - Fatal编程技术网

Java 服务器端使用Android手机作为客户端的BouncyCastle

Java 服务器端使用Android手机作为客户端的BouncyCastle,java,android,security,bouncycastle,java-server,Java,Android,Security,Bouncycastle,Java Server,我目前在让BouncyCastle上班方面遇到了一些困难。我已经在这上面搜索了几天了,所以我希望你能提供一些有用的见解 这是设置。Android客户端使用REST协议向服务器发送POST消息。我制作了一个单独的项目,其中包含表示这些消息的类,这样我就可以在客户端和服务器上都将其作为库包含。消息对象首先解析为JSON字符串,然后在服务器上进行解释 为了数据完整性,消息包含数字签名(DSA)。我问了一个关于公钥交换的问题。我得到的答案很有帮助,因为这似乎是正确的 然而,验证一直失败。Nikolay

我目前在让BouncyCastle上班方面遇到了一些困难。我已经在这上面搜索了几天了,所以我希望你能提供一些有用的见解

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

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

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

下面是message类(来自公共库)的代码摘录:

我将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类的gson.fromJson()调用

我应该提到的最后一件事是,我正在使用ApacheFelix服务器开发MacOSX。如果项目完成,服务器模块应易于移植到另一台机器上


那么,我错在哪里呢?感谢您的帮助。

我不知道ApacheFelix的类加载是如何工作的,但是您不应该多次添加提供程序。移动
Security.addProvider(新的BouncyCastleProvider())java.security
文件中,将代码>部分转换为静态初始值设定项或注册bouncy castle


发生异常的类别是什么?为什么要在默认构造函数中调用JCE代码?这可能是个坏主意,尤其是当使用Gson提供的自动封送时。首先构造对象,然后调用所有验证代码

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


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

设备上已经有了BouncyCastle的一个版本(可能已经很旧了,而且已经损坏了)。这可能会造成干扰。尝试重新打包的版本,比如-它基本上只是一个重构的BouncyCastle,不会干扰设备上任何损坏的POS。
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)