我想解決與appletviewer下不工作的簽名jar的問題。我的主要目標是在瀏覽器之外運行它,所以我嘗試使用appletviewer - 如果您有其他建議,請告訴我。與小程序查看器簽署的jar拋出許可例外
這裏的背景:
- 的Ubuntu 11.10
的Java:
$ 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)
這裏的問題:
- 我有一個罐子myjar.jar那包含裏面裝的
- 一個applet它可以正常工作在瀏覽器中,而不是在下面的appletviewer
運行jar簽署:
$ 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:
- 是,當根證書存在時,所有下列中間證書被假定爲可接受驗證目的的假設?在上面的情況下,是否有必要在cacerts文件中使用yyy?
- 當jar被簽名時,如myjar.jar所示,是否假設appletviewer應該沒有限制地運行?
- 有沒有更好的方法來運行它來避免這種情況?
- 爲什麼瀏覽器的工作方式與appletviewer的工作方式不同?
不確定上述情況,我嘗試將證書添加到另一個稱爲cacerts2的本地文件。我可以證實:
- 密鑰工具列出了cacerts的證書
的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:
- 是在提供信任存儲正道上面?
- 以上是否意味着appletviewer將以與jarsigner相同的方式使用它,當它通過-keystore命令進行驗證時?
我試過的第三件事是使這樣一個政策文件(這是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
結果:
- 補助沒有任何signedBy規範工作,所以我可以確認的政策拿起
- 補助,當任一signedBy失敗
問題集3:
- 這是正確的方式來指定政策和signedBy?我從Oracle找到關於此主題的文檔不完整
- 當jar被簽名時甚至使用策略文件嗎?
- 有沒有其他想法? :)
Touché! :)從[文檔](http://docs.oracle.com/javase/1.4.2/docs/guide/jws/developersguide/syntax.html#security):默認情況下,每個應用程序都運行在受限執行環境,類似於Applet沙箱。 ...如果應用程序請求完全訪問,則所有JAR文件都必須進行簽名。謝謝安德魯! – 2012-01-13 01:37:04
只是想說這正是我需要的 - 一個默認的沙盒環境(它會要求你確認新的證書),除非在jnlp中被明確覆蓋,否則它只能用於簽名文件。我知道JWS,只是從未跨過我的想法(doh!)在這種特殊情況下使用它們...... – 2012-01-13 02:03:38
很酷。很高興你把事情解決了。 :) – 2012-01-13 02:08:30