2012-04-19 15 views
3

Java Web Startの混合コードエラーを解決するのが難しいです。要約すると、メインのJNLPファイルがあり、直接ロードするすべてのコードに署名しています。メインのJNLPにall-permissionsオプションを追加しました。ロードするメインクラスは、署名付きのjarファイルからも得られます。JNLP:符号付きコード内に符号なしコードをロード

JNLP Bから引き出された未署名のリソースをロードする必要があるいくつかの事柄を、メインクラスが少し発動すると、JNLP Bのリソースには署名がなく、特別なアクセス権は必要ありません。

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

未署名のコードは、我々はそうのようなクラスが見つからないエラーが発生します署名したコードによってロードされるようにしようとしている:

JNLPのA:

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 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ファイルを見つけることができない理由はありますか?署名されたコードで符号なしのコードを実行できるように特別なものがありますか?私は、署名されたコードを実行するために署名されていないコードを取得することに問題がある場合のみを見てきました。

答えて

5

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

JNLPAppletLauncherは、信頼できるライブラリがアプレットコードを呼び出す方法の例です。アプレットクラスローダはThread.currentThread().getContextClassLoader()で取得できます。安全な信頼できるライブラリコードを書くのは難しいです。信頼できないコードは信頼できません。

+1

信頼できるコードでは信頼できないコードを実行できないと言っていますか?たとえば、私たちのアプリはWeb Start(アプレットなし)でロードする社内CRMです。当社のCRMは、ローカルファイルシステムへのアクセスが必要な場合があります(署名/全パーマの理由)。私たちのCRMには、UI用のswingx.jar、jhall.jarなどのヘルプセットなど、他のものも必要です。その場合、信頼できるコードはこれらの他のjarファイルにアクセスできません。私たちは信頼できる機能を自分たちのジャーに引き出し、それらに署名し、私たちのメインコアを信頼できないようにして、信頼できないジャーを使うことができるでしょうか? – rmmeans

+0

(アプレットとJNLPWebStartアプリケーション/アプレットは本質的に互換性があります)信頼できないコードの動作に依存する信頼できるコードを使用することはできません。信頼できるコードをライブラリとして持つことはできますが、その上で実行されるすべての操作が安全であることに非常に注意する必要があります。たとえば、指定されたファイル名にいくつかのデータを保存する(安全なままにする)メソッドを持つことはできません。 –

+0

@ TomHawtin-tacklineサンドボックス拡張のコードにデジタル署名が付けられても、それでも問題はありますか? –

関連する問題