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 类的方法,我就没有这个问题。

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

我怎样才能解决这个问题?

编辑

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

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

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

编辑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 包含小程序

编辑 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

第一次运行正常(可能是因为类文件在同一目录中)。然后我创建存档,一个已签名,另一个未签名。当我运行它们时,我得到了这些错误。请注意,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

新理论

当使用您的证书对其进行签名时,第 3 方 Jar 已经被签名。现在Jar里面有2很多关于数字密钥的信息,这让JRE感到困惑。

要么原样使用原始 Jar,要么删除数字签名并使用您自己的证书重新签名。

较早的答案

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

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

我怀疑问题归结为我加粗的错误/评论部分。同一个包
中的类必须在同一个 Jar 中。

于 2012-05-04T15:33:56.887 回答