【问题标题】:java.lang.SecurityException when injecting java agent注入 java 代理时出现 java.lang.SecurityException
【发布时间】:2020-08-23 02:54:43
【问题描述】:

我正在尝试创建一个动态 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。我不认为这是我的代码的问题。有谁知道是什么原因造成的?

【问题讨论】:

    标签: java agent


    【解决方案1】:

    签名者信息与其他类的签名者信息不匹配 在同一个包中

    当从类路径上存在的不同 JAR 文件加载属于同一包的类时,会发生这种情况,并且这些 JAR 文件具有使用不同证书签名的签名 - 或者,可能更常见的是,至少一个已签名,一个或多个其他文件已签名不是。因此,要么确保所有 JAR(或至少包含来自相同包的类)都使用相同的证书进行签名,要么从具有重叠包的 JAR 文件的清单中删除签名。

    【讨论】:

    • 是的,我更改了软件包,由于某种原因它现在可以工作了
    • 您是通过什么方式更改软件包的?这可以帮助其他人@SimonShkolnik
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多