我正在尝试解决签名的jar无法在appletviewer下工作的问题。我的主要目标是在浏览器之外运行它,所以我尝试使用appletviewer - 如果您有其他建议,请告诉我。
以下是上下文:
爪哇:
$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
问题在于:
罐子已签名:
$ jarsigner -verify -certs -verbose -keystore /etc/ssl/certs/java/cacerts myjar.jar
...
smk <file size> <file date> <file name>
X.509, CN=xxx, OU=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
[certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
X.509, CN=yyy, OU=yyy, OU=yyy, O=yyy, C=yyy
[certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
[KeyUsage extension does not support code signing]
X.509, OU=zzz, O=zzz, C=zzz (alias1)
[certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
...
jar verified.
并且,虽然中间签名证书(上面的yyy)不存在,但根目录(zzz - 或alias1)是:
$ keytool -list -v -keystore /etc/ssl/certs/java/cacerts -storepass changeit|grep alias1
alias1, Mmm d, yyyy, trustedCertEntry,
运行此:
$ appletviewer myhtml.html
给出:
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission preferences)
问题集1:
不确定上述内容,我尝试将证书添加到另一个名为cacerts2的本地文件中。我可以证实:
jarsigner输出现在是这样的:
$ jarsigner -verify -certs -verbose -keystore cacerts2 myjar.jar
...
smk <file size> <file date> <file name>
X.509, CN=xxx, OU=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
[certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
X.509, CN=yyy, OU=yyy, OU=yyy, O=yyy, C=yyy (alias2)
[certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
[KeyUsage extension does not support code signing]
X.509, OU=zzz, O=zzz, C=zzz (alias1)
[certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
...
jar verified.
请注意,现在我在输出中存在中间别名(yyy - 或alias2),并对alias1和alias2进行了验证。像这样运行appletviewer:
$ appletviewer -J-Djavax.net.ssl.trustStore=cacerts2 -J-Djavax.net.ssl.trustStorePassword=changeit myhtml.html
仍会导致相同的异常。
问题集2:
我尝试的第三件事是制作这样的政策文件(这是在mypolicy.policy中):
keystore "cacerts2";
// Tried with this and without the next line:
//keystorePasswordURL "cacerts.pass";
// where file cacerts.pass has only "changeit" / "changeit\n" in it (tried both)
// Tried the following three:
grant signedBy "alias1" {
//grant signedBy "alias2" {
//grant {
permission java.lang.RuntimePermission "preferences";
};
并按此运行:
$ appletviewer -J-Djava.security.policy=mypolicy.policy myhtml.html
并且像这样:
$ appletviewer -J-Djavax.net.ssl.trustStore=cacerts2 -J-Djavax.net.ssl.trustStorePassword=changeit -J-Djava.security.policy=mypolicy.policy myhtml.html
结果:
问题集3:
答案 0 :(得分:3)
我的主要目标是在浏览器之外运行它,..
使用Java Web Start,可以在1.2天左右启动applet自由浮动。 (或者将代码转换为框架。)
如果要测试的主要内容,您可以尝试Appleteer。 AFAIR我从来没有为它实现一个沙盒(所以即使是未签名的applet代码也会表现得像它一样可信)。
AppletViewer 使用启动没有安全沙箱的applet,即使它们没有签名。现在它是相反的并且有一个沙盒,并且没有办法让它接受签名的代码作为信任!
IDE似乎将一个策略文件应用于查看器,以便让用户配置IDE。