Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在签名小程序中使用AccessControler.doPrivileged时调用TargetException_Java_Javascript_Security_Applet_Invocationtargetexception - Fatal编程技术网

Java 在签名小程序中使用AccessControler.doPrivileged时调用TargetException

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

我在通过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中)

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