在签名的applet中使用AccessControler.doPrivileged时的InvocationTargetException

时间:2012-05-04 14:38:05

标签: java javascript security applet invocationtargetexception

我在通过JavaScript调用的applet中使用以下方法

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

创建的证书对applet进行签名

当我调用getAString()时,如果抛出InvocationTargetException。 如果我调用其他不使用AccessController类的方法,我就没有这个问题。

此外,每次打开浏览器时,我都会被要求允许applet运行,即使applet已经签名。

我该如何解决这个问题?

修改

我添加了一个按钮,现在我收到了更多信息:

  

签名者信息与其他类的签名者信息不匹配   在同一个包中

我正在使用第三方存档。原始形式是未签名的,但我使用相同的证书签名(尽管使用不同的命令)。

编辑2 这是我签署罐子的方式

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包含applet

编辑3

applet定义(位于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

第一次运行正常(可能是因为类文件在同一目录中)。 然后我创建了档案,一个签名,另一个未签名。当我运行它们时,我得到了那些错误。请注意,jar放在一个单独的文件夹中,该文件夹只包含那些jar文件而没有类文件。

2 个答案:

答案 0 :(得分:2)

我和Andrew在一起。

我创建了一款可以帮助我们找到代码签名问题的应用。

https://gist.github.com/2596125

(因为我们不希望垃圾邮件安德鲁我创造了这个。)

随着更多信息终于出现,似乎你没有用jar包装TestPrivileges$1类。

要解决此问题,请执行以下操作:

jar cvf TestPrivileges.jar TestPrivileges.class TestPrivileges$1.class

答案 1 :(得分:1)

新理论

第三方Jar在与您的证书签名时已经签名。现在Jar中有2个关于数字键的信息,这让JRE感到困惑。

使用原始Jar,或者删除数字签名并使用您自己的证书再次签名。

早期回答

  

签名者信息与相同包

中其他类的签名者信息不匹配      

实际错误是因为两个罐子被认为是使用不同的证书签名,即使我使用相同的证书。

我怀疑问题归结为我做出的粗体错误/评论部分。
相同包中的类必须位于相同的Jar中。