我在通过 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)
这是一个测试类:
请注意,调用其他方法不会引发此异常。
这是我编译和运行它的方法:
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,没有类文件。