8

classLoader.getResources("META-INF/MANIFEST.MF") の結果を反復処理して、クラス パス上の jar のリストを返すコードがあります。これは、1.6.0_18 から 1.7.0_40 まで問題なく機能しました。1.7.0_45 では、署名付き/未署名のコードが混在しているというセキュリティ警告ポップアップを表示することで、これを破っています。

問題を示す小さな自己完結型テストケース:

package testcase;
import java.io.*;
import java.net.*;
import java.util.Enumeration;
import java.util.logging.*;
public class TestCase {
    public static void main(String[] args) {
        getAllJarUrls();
    }

    public static void getAllJarUrls() {
        try {
            final Enumeration<URL> mfUrls = Thread.currentThread().getContextClassLoader().getResources("META-INF/MANIFEST.MF");
            while (mfUrls.hasMoreElements()) {
                URL jarUrl = mfUrls.nextElement();
                if (!jarUrl.getProtocol().equals("jar")) {
                    continue;
                }
                try {
                    System.out.println(jarUrl.toURI());
                } catch (URISyntaxException ex) {
                    Logger.getLogger("testcase").log(Level.SEVERE, null, ex);
                }
            }
        } catch (IOException e) {
            Logger.getLogger("testcase").log(Level.SEVERE, null, e);
        }
    }
}

次のように jnlp (有効な証明書で署名された jar) を使用してこれを起動します。

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://localhost/test" href="test.jnlp">
    <information>
        <title>test</title>
        <vendor>test</vendor>
      </information>
    <security><all-permissions/></security>
    <resources>
        <jar href="testcase.jar" main="true" download="eager"/>
    </resources>
    <application-desc main-class="testcase.TestCase"/>
</jnlp>

実行すると、コンソールが表示され、詳細な出力の場合は「5」を押します。次に、セキュリティ プロンプトで [ブロック] をクリックして、例外を確認します。[許可] をクリックすると、コードが正常に実行されますが、これは許容できるユーザー エクスペリエンスではありません。特に、アプリケーションはユーザー入力なしで開始できる必要があるためです。

1.7.0_45 での出力は次のとおりです。

CacheEntry[http://localhost/test/testcase.jar]: updateAvailable=true,lastModified=Tue Oct 15 21:09:21 CDT 2013,length=6314
jar:file:/C:/jre32/1.7.0_45/lib/javaws.jar!/META-INF/MANIFEST.MF
jar:file:/C:/jre32/1.7.0_45/lib/deploy.jar!/META-INF/MANIFEST.MF
jar:file:/C:/jre32/1.7.0_45/lib/plugin.jar!/META-INF/MANIFEST.MF
jar:file:/C:/jre32/1.7.0_45/lib/deploy.jar!/META-INF/MANIFEST.MF
Trace level set to 5: all ... completed.Trace level set to 5: all ... completed.
security: resource name "META-INF/MANIFEST.MF" in http://localhost/test/testcase.jar : java.lang.SecurityException: trusted loader attempted to load sandboxed resource from http://localhost/test/testcase.jar

testcase.jar は署名されています。新しいマニフェスト属性もすべて含まれています: Application-Name: testcase Permissions: all-permissions Codebase: *

7u40 から 7u45 への deploy.jar から逆コンパイルされた CPCallBackHandler の diff は、重要な変更を示しています。LiveConnect の変更により、既存の機能が機能しなくなったようです。いいえ、ここには LiveConnect は含まれていません。

他の誰かがこれに遭遇しましたか?回避策の提案はありますか? バグを報告しますか?

(注:OTN Javaフォーラムにも投稿されていますが、ここでより迅速な回答を期待しています:)。

ありがとう、クリス

4

4 に答える 4

7

これを jar のマニフェストに追加します。

Trusted-Library: true

ここに文書化されています。

于 2013-10-16T05:37:00.640 に答える
0

classloader.getResourceAsStream()7u45で問題が発生し始めました。JAR に署名することはできましたが、埋め込むことはできませんでしたJNLP-INF/{APPLICATION.JNLP,APPLICATION_TEMPLATE.JNLP}(ヒープ設定が異なる 2 つの署名されていない application.jnlp バリアントが必要だったため)。

とにかく、埋め込みによってこの問題を修正しましたJNLP-INF/APPLICATION_TEMPLATE.JNLP。他の誰かがこの特定の問題を抱えている場合に備えて投稿してください。

于 2013-10-19T17:19:11.940 に答える
0

Netbeans RCP に基づくアプリケーションでこの問題が発生します。Netbeans は、すべてのマニフェスト ファイルをロードして、独自のエントリを読み取ります。これにより、アプリケーションに含まれるすべての JAR に対して Security-Exception が発生します。Java はマニフェスト ファイル自体を信頼できないリソースと見なしているようです。これが意図されたものなのかバグなのかはわかりません。

于 2013-12-18T12:44:10.993 に答える