java - JNLP:在签名代码中加载未签名代码

标签 java classloader code-signing jnlp

我们在解决 Java webstart 的混合代码错误时遇到困难。总之,我们有主要的 JNLP 文件,我们已经签署了它直接加载的所有代码。我们已经向主 JNLP 添加了所有权限选项。它加载的主要类也来自签名的 jar。

当主类稍微开始时,它会触发一些需要加载从 JNLP B 中提取的未签名资源的东西。JNLP B 的资源都没有签名,它们不需要任何特殊权限。

所有已签名的代码都已根据来自 Oracle 的混合代码文档进行了设置,并且在签名之前已使用“Trusted-Library: true”的 list 设置了 jar 文件。

当签名代码尝试加载未签名代码时,我们会得到一个找不到类的错误,如下所示:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

    Caused by: java.lang.NoClassDefFoundError: org/some/external/package/that/is/not/signed
at org.our.signed.package.main(Main.java:87)
... 9 more

    Caused by: java.lang.ClassNotFoundException: org.some.external.package.that.is.not.signed
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 10 more

这是 JNLP 中的场景:

JNLP A:(总结)

<jnlp spec="1.5+" codebase="...." href="......">
  <information>
   ...etc
  </information>
   <security>
     <all-permissions/>
   </security>
   <resources>
      <j2se version="1.6+" initial-heap-size="80m" max-heap-size="256m" href="http://java.sun.com/products/autodl/j2se"/>
      <jar href="signedJar_1.jar" download="eager" main="true"/>
      <jar href="signedJar_2.jar" download="eager" main="false"/>
      <extension name="unsigned_ext" href="unsigned.jnlp"/>
  </resources>
  <application-desc main-class="(FROM SIGNED CLASS in signedJar_1.jar)"/>
</jnlp>

JNLP B(unsigned.jnlp 加载程序)

<jnlp spec="1.5+" codebase="....." href="......">
  <information>
   ...etc
  </information>
  <resources>
    <jar href="unsigned.jar"/>
  </resources>
  <component-desc/>
</jnlp>

我们注意到安全异常工作正常,因为如果我们将未签名的 jar 移动到具有所有权限且已签名 jar 的 JNLP 中,我们将获得 Java 不允许我们混合的预期安全异常使用 Trusted-Library 签名的代码:没有 list 属性的真实和未签名代码。

想法?类加载器无法从未签名代码中找到 java 文件是否有原因?我们是否缺少一些特殊的东西来允许签名代码运行未签名代码?我只看到人们在使用未签名代码运行签名代码时遇到问题,我可以理解。

最佳答案

可信库类加载器是(可能不受信任的)applet 类加载器的父级(在类加载器委托(delegate)的意义上)。把它想象成引导类加载器。因此不受信任的类可以链接到受信任的库类,但反之则不行。无需费心更改 list 和使用 WebStart,您可以通过使用 -Xbootclasspath/a: 添加受信任的类和使用 -classpath 添加不受信任的类来尝试这些东西(这就是该功能在实现之前的试用方式。

JNLPAppletLauncher 是如何让可信库调用 applet 代码的示例。 applet 类加载器可以通过 Thread.currentThread().getContextClassLoader() 获得,它只是从那里反射。编写安全的可信库代码很棘手。请记住,您不能相信不受信任的代码。

关于java - JNLP:在签名代码中加载未签名代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10236392/

相关文章:

java - MS 交换日历和 Java 应用程序之间的双向同步

java - Tomcat - 异步 HTTP 调用超慢与 Jetty

c# - 代码签名证书是否有助于病毒扫描程序的误报

c# - 使用驱动程序签名证书进行代码签名

java - 如何将java代码添加到静态网页中?

java - 如何禁用破坏我的 Activity

java:是否有一个框架允许动态加载和卸载jar(但不是osgi)?

java - 在java中卸载类?

java - 在 jar 启动时预加载 java 类/库?

ios - 错误 : "A valid provisioning profile for this executable was not found"