Java 在签名小程序中使用AccessControler.doPrivileged时调用TargetException
我在通过JavaScript调用的小程序中使用了以下方法Java 在签名小程序中使用AccessControler.doPrivileged时调用TargetException,java,javascript,security,applet,invocationtargetexception,Java,Javascript,Security,Applet,Invocationtargetexception,我在通过JavaScript调用的小程序中使用了以下方法 public String getAString() { Object rc = AccessController.doPrivileged( new java.security.PrivilegedAction() { public Object run() { try
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中)
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,没有类文件。New theory
第三方Jar在使用您的证书签名时已经签名。现在Jar中有两个关于数字键的信息,这让JRE感到困惑
可以原样使用原始Jar,也可以删除数字签名并使用自己的证书再次签名
早先的答复
签名者信息与相同包中其他类的签名者信息不匹配
实际的错误是因为两个JAR被认为是使用不同的证书签名的,即使我使用的是相同的证书
我怀疑问题的根源在于我所做的错误/评论的粗体部分
同一个包中的类必须在同一个罐子中。新理论
第三方Jar在使用您的证书签名时已经签名。现在Jar中有两个关于数字键的信息,这让JRE感到困惑
可以原样使用原始Jar,也可以删除数字签名并使用自己的证书再次签名
早先的答复
签名者信息与相同包中其他类的签名者信息不匹配
实际的错误是因为两个JAR被认为是使用不同的证书签名的,即使我使用的是相同的证书
我怀疑问题的根源在于我所做的错误/评论的粗体部分
同一个包中的类必须在同一个罐子中。关于这一点,我同意Andrew
我已经创建了一个应用程序,可以帮助我们找到代码签名问题
(因为我们不想给安德鲁发垃圾邮件,所以我创建了这个。)
随着更多信息的最终公布,您似乎没有用jar打包TestPrivileges$1
类
要解决此问题,请执行以下jar打包操作:
jar cvf TestPrivileges.jar TestPrivileges.class TestPrivileges$1.class
在这件事上我和安德鲁是一致的
我已经创建了一个应用程序,可以帮助我们找到代码签名问题
(因为我们不想给安德鲁发垃圾邮件,所以我创建了这个。)
随着更多信息的最终公布,您似乎没有用jar打包TestPrivileges$1
类
要解决此问题,请执行以下jar打包操作:
jar cvf TestPrivileges.jar TestPrivileges.class TestPrivileges$1.class
哪一行抛出了
调用targetException
?我很难在块中找到任何可能导致异常的东西。@kroae27没有具体的行。我使用JavaScript警报(appletName.getAString())调用该方法;查看此代码块为什么使用AccessController.doPrivileged
?我希望它在没有它的情况下也能工作,除非“OK”
实际上意味着类似于System.getProperty(“user.home”)
@AdrianIftode的意思不是有不同的签名者,而是同一个包中的类有不同的签名者。一个常见的被忽略的地方是多个JAR在默认包中有类。哪一行抛出了InvocationTargetException
?我很难在块中找到任何可能导致异常的东西。@kroae27没有具体的行。我使用JavaScript警报(appletName.getAString())调用该方法;查看此代码块为什么使用AccessController.doPrivileged
?我希望它在没有它的情况下也能工作,除非“OK”
实际上意味着类似于System.getProperty(“user.home”)
@AdrianIftode的意思不是有不同的签名者,而是同一个包中的类有不同的签名者。一个经常被忽略的地方是多个jar在默认包中有类。我有一个类,一个包和结果jar(小程序本身)。我还导入了另一个jar,它是用相同的keystrei签名的。我更新了这个问题,也许签名有问题,每个jar中都有哪些包?我希望我们指的是相同的东西。第一个jar JSPrint.jar(带有applet类)位于名为Eplatforms的包中,第二个jar(是第三方jar)的包名为com.XXXX.pdfPrint.pdfPrint。(当我说包裹时,我想到的是这个和s