0

JavaScript経由で呼び出されるアプレットに次のメソッドがあります

public String getAString()
    {
        Object rc = AccessController.doPrivileged(
        new java.security.PrivilegedAction() 
        {
            public Object run()
            {
                try
                {
                    return "OK";
                }
                catch (Throwable t)
                {
                    t.printStackTrace();
                    return "ERROR: " + t.getMessage() + " " + t.getCause();
                }
            }
        });


        // Return value
        return rc.toString();
    }

アプレットは、keytool で作成された証明書を使用して署名されます

getAString()ifを呼び出すと、 InvocationTargetException. AccessController クラスを使用しない他のメソッドを呼び出すと、この問題は発生しません。

また、ブラウザを開くたびに、アプレットが署名されていても、アプレットの実行を許可するよう求められます。

どうすればこれを修正できますか?

編集

ボタンを追加したところ、より多くの情報が得られるようになりました:

署名者情報が同じパッケージ内の他のクラスの署名者情報と一致しない

サードパーティのアーカイブを使用しています。元の形式では署名されていませんが、同じ証明書を使用して署名しました (ただし、コマンドは異なります)。

edit 2 jarに署名する方法は次のとおりです

keytool -genkey -keystore vkeystore -keyalg rsa -dname "CN=XXX, OU=XXX, O=XXX, L=Atlanta, ST=GA,C=NL" -alias printer -validity 3600 -keypass XXX-storepass XXX

jarsigner -keystore vkeystore -storepass XXX -keypass XXX -signedjar JSPrintS.jar JSPrint.jar printer

jarsigner -keystore vkeystore -storepass XXX -keypass XXX -signedjar jPDFPrintS.jar jPDFPrint.jar printer

JSPrint.jar にはアプレットが含まれています

編集 3

アプレットの定義は (JSPrint.jar にあります)

package Eplatforms;

import java.net.URL;
import java.security.AccessController;

import javax.swing.JApplet;
import java.awt.event.*;
import java.awt.*;

import com.XXX.pdfPrint.PDFPrint;

public class JSPrint extends JApplet implements ActionListener
....

jPDFPrint.jar はサードパーティの jar です

編集4

私は問題を少し最小限に抑えようとしましたが、jar ファイル (署名されたファイルであっても) から AccessControler.doPrivileged を呼び出すと、次の例外が発生することがわかりました。

Exception in thread "main" java.lang.NoClassDefFoundError: TestPrivileges$1
        at TestPrivileges.getAString(TestPrivileges.java:14)
        at TestPrivileges.main(TestPrivileges.java:7)
Caused by: java.lang.ClassNotFoundException: TestPrivileges$1
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)

テストクラスは次のとおりです。

http://pastebin.com/EgmdwuqL

他のメソッドを呼び出しても、この例外は発生しないことに注意してください。

コンパイルして実行する方法は次のとおりです。

javac TestPrivileges.java
java TestPrivileges
jar cvf TestPrivileges.jar TestPrivileges.class
jarsigner -keystore vkeystore -storepass My0Company -keypass My0Company -signedjar TestPrivilegesS.jar TestPrivileges.jar printer
copy TestPrivilegesS.jar x /Y
copy TestPrivileges.jar x /Y
cd x
java -classpath TestPrivilegesS.jar TestPrivileges
java -classpath TestPrivileges.jar TestPrivileges
cd ..

vkeystore の簡単な説明:

keytool -genkey -keystore vkeystore -keyalg rsa -dname "CN=MyCompany, OU=MyCompany, O=MyCompany, L=Atlanta, ST=GA,C=NL" -alias printer -validity 3600 -keypass My0Company -storepass My0Company

最初の実行は問題なく動作します (おそらく、クラス ファイルが同じディレクトリにあるためです)。次に、1 つは署名済み、もう 1 つは未署名のアーカイブを作成します。それらを実行すると、それらのエラーが発生しました。jar は、それらの jar のみを含み、クラス ファイルを含まない別のフォルダーにあることに注意してください。

4

2 に答える 2

2

私はこれについてアンドリューと一緒です。

コード署名の問題を見つけるのに役立つアプリを作成しました。

https://gist.github.com/2596125

(Andrew にスパムを送信したくないので、これを作成しました。)

最終的に出てきたより多くの情報では、TestPrivileges$1クラスを瓶に詰め込んでいないようです。

これを修正するには、jar パッキングに対して次のようにします。

jar cvf TestPrivileges.jar TestPrivileges.class TestPrivileges$1.class
于 2012-05-04T17:27:07.833 に答える
1

新しい理論

サードパーティの Jar は、証明書で署名された時点ですでに署名されています。現在、Jar 内のデジタル キーに関する 2 つの多くの情報があり、JRE を混乱させています。

元の Jar をそのまま使用するか、デジタル署名を削除して独自の証明書で再度署名します。

以前の回答

署名者情報が同じパッケージ内の他のクラスの署名者情報と一致しない

実際のエラーは、同じ証明書を使用していても、 2 つの jarが異なる証明書で署名されていると見なされるためです。

問題は、太字にしたエラー/コメントの部分にあると思われます。同じパッケージ
内のクラスは、同じ Jarにある必要があります。

于 2012-05-04T15:33:56.887 に答える