java.lang.SecurityException 注射 java 剂时
java.lang.SecurityException when injecting java agent
我正在尝试创建一个动态 java 代理,但在加载代理时抛出此错误:
com.sun.tools.attach.AgentInitializationException: Agent JAR loaded but agent failed to initialize
at jdk.attach/sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:165)
at jdk.attach/com.sun.tools.attach.VirtualMachine.loadAgent(VirtualMachine.java:538)
at injector.main(injector.java:20)
这是目标应用程序上显示的错误:
java.lang.SecurityException: class "agent"'s signer information does not match signer information of other classes in the same package
at java.base/java.lang.ClassLoader.checkCerts(ClassLoader.java:1151)
at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:906)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1015)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:431)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:535)
代理没有可能触发错误的代码,因为现在它是用于测试的单个 System.out.println 语句。我使用此代码注入代理:
VirtualMachine vm = VirtualMachine.attach(vmd);
vm.loadAgent("myagentpath");
vm.detach();
目标应用程序是运行 java 的正态分布。我不认为这是我的代码的问题。有谁知道这可能是什么原因造成的?
signer information does not match signer information of other classes
in the same package
当属于同一个包的 类 从类路径中存在的不同 JAR 文件加载时会发生这种情况,并且这些 JAR 文件具有使用不同证书签名的签名 - 或者,也许更常见的是,至少有一个是已签名,而其他一个或多个未签名。因此,要么确保所有 JAR(或至少包含来自相同包的 类 的 JAR)都使用相同的证书签名,要么从具有重叠包的 JAR 文件清单中删除签名。
我正在尝试创建一个动态 java 代理,但在加载代理时抛出此错误:
com.sun.tools.attach.AgentInitializationException: Agent JAR loaded but agent failed to initialize
at jdk.attach/sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:165)
at jdk.attach/com.sun.tools.attach.VirtualMachine.loadAgent(VirtualMachine.java:538)
at injector.main(injector.java:20)
这是目标应用程序上显示的错误:
java.lang.SecurityException: class "agent"'s signer information does not match signer information of other classes in the same package
at java.base/java.lang.ClassLoader.checkCerts(ClassLoader.java:1151)
at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:906)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1015)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:431)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:535)
代理没有可能触发错误的代码,因为现在它是用于测试的单个 System.out.println 语句。我使用此代码注入代理:
VirtualMachine vm = VirtualMachine.attach(vmd);
vm.loadAgent("myagentpath");
vm.detach();
目标应用程序是运行 java 的正态分布。我不认为这是我的代码的问题。有谁知道这可能是什么原因造成的?
signer information does not match signer information of other classes in the same package
当属于同一个包的 类 从类路径中存在的不同 JAR 文件加载时会发生这种情况,并且这些 JAR 文件具有使用不同证书签名的签名 - 或者,也许更常见的是,至少有一个是已签名,而其他一个或多个未签名。因此,要么确保所有 JAR(或至少包含来自相同包的 类 的 JAR)都使用相同的证书签名,要么从具有重叠包的 JAR 文件清单中删除签名。