java.lang.SecurityException 有反思
java.lang.SecurityException with reflection
在你重复这个问题之前,我会向你解释我所知道的,我读过的其他问题,以及为什么这对我不起作用。
我的目标是实现一个基于 java 的游戏的反射,我有 .jar。我将它作为外部库附加到我的 eclipse 项目中。
我遇到了错误
java.lang.SecurityException: class "Client"'s signer information does not match signer information of other classes in the same package
上线
Class clazz = Client.class;
现在如其他问题所述。出现此错误的原因是我有两个引用的库签名不同? (也许意味着它们是用不同版本的 java 编译的?)。
我引用的唯一两个库是 JRE 系统(我的项目是基于 1.7 构建的)和游戏的 .jar。
如果 .jar 是在 1.6 上编译的,是否会发生此错误?我应该使用 JRE 1.6 重新制作我的项目吗?我如何知道客户端是用什么 JRE 版本编译的?
谢谢!
编辑:我的另一个想法是游戏本身的 .jar 文件可能 类 具有不同的签名(可能是为了停止反射)。这可能吗?
我假设如下。
您在(已签名的)游戏罐中有以下内容
the/game/Client.class
并且在您的(可能未签名的)反射代码中您有
the/game/ReflectionStuff.class
这会导致上述异常。
编辑
在下面找到一个小的 PoC 来演示问题。从特定包调用的第一个 class 定义了签名密钥,该密钥对于同一包中的所有 class 必须相同。
public class Client {
}
public class ReflectionStuff {
public static void main(String[] args) {
Class clazz = Client.class;
}
}
编译代码
javac -d bin/ Client.java ReflectionStuff.java
创建 jar 文件
mkdir bin
jar cf Game.jar -C bin/ Client.class
jar cf Reflection.jar -C bin/ ReflectionStuff.class
为签名生成密钥
keytool -genkey -alias signGame -keystore gamestore.jks -storepass passStore -keypass passGame -dname "CN=John Doe"
仅对游戏 jar 进行签名
jarsigner -keystore gamestore.jks -storepass passStore -keypass passGame -signedjar SignedGame.jar Game.jar signGame
从同一个包(默认包)中调用未签名的class
java -cp SignedGame.jar;Reflection.jar ReflectionStuff
要解决此问题,请将 classes 移动到不同的 Java 包中。
在你重复这个问题之前,我会向你解释我所知道的,我读过的其他问题,以及为什么这对我不起作用。
我的目标是实现一个基于 java 的游戏的反射,我有 .jar。我将它作为外部库附加到我的 eclipse 项目中。
我遇到了错误
java.lang.SecurityException: class "Client"'s signer information does not match signer information of other classes in the same package
上线
Class clazz = Client.class;
现在如其他问题所述。出现此错误的原因是我有两个引用的库签名不同? (也许意味着它们是用不同版本的 java 编译的?)。
我引用的唯一两个库是 JRE 系统(我的项目是基于 1.7 构建的)和游戏的 .jar。
如果 .jar 是在 1.6 上编译的,是否会发生此错误?我应该使用 JRE 1.6 重新制作我的项目吗?我如何知道客户端是用什么 JRE 版本编译的?
谢谢!
编辑:我的另一个想法是游戏本身的 .jar 文件可能 类 具有不同的签名(可能是为了停止反射)。这可能吗?
我假设如下。
您在(已签名的)游戏罐中有以下内容
the/game/Client.class
并且在您的(可能未签名的)反射代码中您有
the/game/ReflectionStuff.class
这会导致上述异常。
编辑
在下面找到一个小的 PoC 来演示问题。从特定包调用的第一个 class 定义了签名密钥,该密钥对于同一包中的所有 class 必须相同。
public class Client {
}
public class ReflectionStuff {
public static void main(String[] args) {
Class clazz = Client.class;
}
}
编译代码
javac -d bin/ Client.java ReflectionStuff.java
创建 jar 文件
mkdir bin
jar cf Game.jar -C bin/ Client.class
jar cf Reflection.jar -C bin/ ReflectionStuff.class
为签名生成密钥
keytool -genkey -alias signGame -keystore gamestore.jks -storepass passStore -keypass passGame -dname "CN=John Doe"
仅对游戏 jar 进行签名
jarsigner -keystore gamestore.jks -storepass passStore -keypass passGame -signedjar SignedGame.jar Game.jar signGame
从同一个包(默认包)中调用未签名的class
java -cp SignedGame.jar;Reflection.jar ReflectionStuff
要解决此问题,请将 classes 移动到不同的 Java 包中。