2012-01-12 45 views
2

我想解決與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被簽名時甚至使用策略文件嗎?
  • 有沒有其他想法? :)

回答

3

我的主要目標是在瀏覽器外運行它,..

使用Java Web Start,這可能會推出小應用程序自由浮動,因爲周圍1.2天。 (或者將代碼轉換爲一個幀。)

如果這個測試的要點是測試,您可以試試Appleteer。 AFAIR我從來沒有想過爲它實現一個沙盒(即使未簽名的applet代碼也會像被信任一樣)。


的appletviewer 使用推出Applet,而沒有一個安全沙盒,即使他們沒有簽署。現在它正好相反,並且有一個沙箱,並且沒有辦法讓它接受簽名代碼作爲可信任的!

IDE似乎將策略文件應用於查看器,以便讓用戶執行配置IDE的操作。

+0

Touché! :)從[文檔](http://docs.oracle.com/javase/1.4.2/docs/guide/jws/developersguide/syntax.html#security):默認情況下,每個應用程序都運行在受限執行環境,類似於Applet沙箱。 ...如果應用程序請求完全訪問,則所有JAR文件都必須進行簽名。謝謝安德魯! – 2012-01-13 01:37:04

+0

只是想說這正是我需要的 - 一個默認的沙盒環境(它會要求你確認新的證書),除非在jnlp中被明確覆蓋,否則它只能用於簽名文件。我知道JWS,只是從未跨過我的想法(doh!)在這種特殊情況下使用它們...... – 2012-01-13 02:03:38

+0

很酷。很高興你把事情解決了。 :) – 2012-01-13 02:08:30