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