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 クラスを使用しない他のメソッドを呼び出すと、この問題は発生しません。
また、ブラウザを開くたびに、アプレットが署名されていても、アプレットの実行を許可するよう求められます。
どうすればこれを修正できますか?
編集
ボタンを追加したところ、より多くの情報が得られるようになりました:
署名者情報が同じパッケージ内の他のクラスの署名者情報と一致しない
サードパーティのアーカイブを使用しています。元の形式では署名されていませんが、同じ証明書を使用して署名しました (ただし、コマンドは異なります)。
edit 2 jarに署名する方法は次のとおりです
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
最初の実行は問題なく動作します (おそらく、クラス ファイルが同じディレクトリにあるためです)。次に、1 つは署名済み、もう 1 つは未署名のアーカイブを作成します。それらを実行すると、それらのエラーが発生しました。jar は、それらの jar のみを含み、クラス ファイルを含まない別のフォルダーにあることに注意してください。