3

JavaWebStartの混合コードエラーを乗り越えるのに問題があります。要約すると、メインのJNLPファイルがあり、直接ロードするすべてのコードに署名しました。メインのJNLPにall-permissionsオプションを追加しました。ロードするメインクラスも、署名されたjarから取得されます。

メインクラスが少し先に開始すると、JNLP Bからプルされた署名されていないリソースをロードする必要があるものがいくつか起動されます。JNLPBのリソースはいずれも署名されておらず、特別な権限は必要ありません。

署名されたコードはすべて、Oracleの混合コードのドキュメントに基づいて設定されており、jarファイルは署名前に「Trusted-Library:true」のマニフェストで設定されています。

署名されていないコードを署名されたコードでロードしようとすると、次のようなクラスが見つからないというエラーが発生します。

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:マニフェスト属性のない真の署名されていないコード。

アイデア?クラスローダーが署名されていないコードからJavaファイルを見つけられない理由はありますか?署名されたコードが署名されていないコードを実行できるようにするために欠けている特別なものはありますか?私は、署名されたコードを実行するために署名されていないコードを取得する際に問題が発生する場合のみを見てきました。これは理解できます。

4

1 に答える 1

5

信頼できるライブラリ クラス ローダーは、(信頼できない可能性がある) アプレット クラス ローダーの (クラス ローダー委任という意味での) 親です。ブート クラス ローダーであるかのように考えてください。そのため、信頼できないクラスは信頼できるライブラリ クラスにリンクできますが、その逆はできません。マニフェストを変更したり WebStart を使用したりする手間をかけずに、信頼できるクラスと-Xbootclasspath/a:信頼できないクラスを追加することで、このようなことを試すことができます-classpath(これは、機能が実装される前に試された方法です)。

JNLPAppletLauncherは、信頼できるライブラリにアプレット コードを呼び出す方法の例です。アプレット クラス ローダは で取得できThread.currentThread().getContextClassLoader()、そこからのリフレクションです。安全で信頼できるライブラリ コードを記述するのは難しい作業です。信頼されていないコードは信頼できないことに注意してください。

于 2012-04-19T21:46:59.480 に答える