Java7 安全機制和自簽名證書的使用

Java7 安全機制和自簽名證書的使用

                                                                                                        created on 2013-11-13 

updated on 2014-5-8

Java爲了增強安全性,到1.7.45已經累計增加了若干安全功能,jar包中的META-INF/MANIFEST.MF文件被用來描述jar文件的配置信息和安全信息,在增加的安全信息中可以顯式的定義7個安全屬性。

1權限屬性Permissions Attribute,它用來驗證RIA運行時請求的權限與JAR文件生成中設置的權限一致性情況,它可以阻止別人用已經簽名的程序重新部署並在不一樣的權限下運行,該屬性值可以設置sandbox或all-permissions,簽名的Jar默認爲all-permissions,未簽名的默認爲sandbox。

Sandbox:使Applet或Webstart運行在沙箱中,與本地環境隔離。

Manifest-Version: 1.0

Permissions: sandbox

….

MANIFEST.MF中定義的Permissions與applet的參數標籤permissions保持一致爲sandbox

<applet …>

<param name="permissions"value="sandbox" />

<applet>

 

all-permissions:使簽名的Applet或Webstart在本地環境下不受限訪問。

Manifest-Version: 1.0

Permissions: all-permissions

….

MANIFEST.MF中定義的Permissions與applet的參數標籤permissions保持一致爲all-permissions

<?xml version="1.0"encoding="utf-8"?>

<!-- JNLP File Application -->

<jnlp …

<security>

     <all-permissions/>

 </security>

</jnlp>

另外設置的屬性值必須與applet標籤或者JNLP的安全屬性定義一致,當不一致時運行會被阻止,如果沒有權限屬性,在JAVA控制檯安全級別安全級別爲高或中時會彈出沒有包含“權限”的黃色感嘆號警告信息且無法隱藏,在JAVA控制檯安全級別爲非常高時會被阻止。

通過添加權限屬性,可以去掉黃色背景提醒

假設MANIFEST.txt文件在classes下

Permissions: all-permissions

Application-Name: SSC File Transfer

Caller-Allowable-Codebase: https://127.0.0.1

Application-Library-Allowable-Codebase:https://127.0.0.1

Codebase: https://127.0.0.1

Trusted-Only: true

Trusted-Library: true

 

執行

cdD:\workspaces\eclipse_main\FileBrowserApplet\bin

jar cvfm filebrowser.jar MANIFEST.txtcn

 

 

2代碼庫屬性Codebase Attribute

        用來限制jar代碼庫在指定域名上的運行,防止在其他地址上惡意地重新部署未授權的應用。

匹配

不匹配

*

All domains

 

https://*.example.com

https://a.example.com
https://a.b.example.com

http://a.example.com
http://a.b.example.com

www.example.com

https://www.example.com, http://www.example.com 

http://example.com
http://example.net

www.example.com:8085

https://www.example.com:8085, http://www.example.com:8085

http://www.example.com

*.example.com

https://a.example.com, http://a.example.com
https://a.b.example.com, http://a.b.example.com
https://example.com, http://example.com

http://example.net

127.0.0.1

http://127.0.0.1
http://127.0.0.1:8080
http://127.0.0.1:80

http://localhost

127.0.0.1:8080

http://127.0.0.1:8080

http://127.0.0.1
http://127.0.0.1:80

 

代碼庫屬性必須與applet運行的實際地址一致,如果沒有代碼庫屬性,則會在控制檯中顯示警告,applet或者JNLP標籤的代碼庫將會被使用。如果沒有定義如HTTPS安全匹配的規則,則可能會被“中間人攻擊“方式截取和攻擊。

 

3應用名稱屬性Application-Name Attribute:用來在安全對話框中顯示簽名應用的名稱。

        Application-Name:Hello World

如果沒有應用名稱屬性,則會在控制檯中顯示警告,並使用入口類(Main-Class)屬性替代。 

 

 

4應用庫許可代碼庫屬性Application-Library-Allowable-Codebase Attribute

定義簽名的applet可以在哪些地址使用,在安全對話框中的地址欄中將顯示給用戶applet與jnlp或頁面地址不同的地址。爲屬性設置JAR、JNLP和HTML所在的地址,使用空格分割。

如果applet的JAR文件與JNLP和和HTML在一個地址,就不需要設置。

Application-Library-Allowable-Codebase:https://host.example.com *.samplehost.com/apps

 

5調用者許可代碼庫屬性Caller-Allowable-Codebase Attribute

決定哪些地址的javascript可以調用applet,爲運行javascript調用applet的地址設置屬性值,如果javascript調用applet的地址沒有定義,則調用會被阻止。

如果沒有設置調用者許可代碼庫屬性,當javascript嘗試調用applet時,會彈出安全提示,用戶根據需要決定是否阻止。

另外,Trusted-Library屬性和Caller-Allowable-Codebase屬性在兼容性方面存在問題,Trusted-Library的類加載器在Java 7u45成爲所有庫的父類加載器,而之前版本所有受信庫都加載到獨立而唯一的類加載器,導致了Java 7u45中不能在加入Caller-Allowable-Codebase 屬性的同時加入Trusted-Library屬性,否則會彈出警告。

Application-Name: ...

Codebase: *

Caller-Allowable-Codebase: *

Permissions: all-permissions

經過測試JVMs:

  • Java 6u20 (OK)
  • Java 7u21–必須包含Trusted-Library否則 warning
  • Java 7u25 -必須包含Trusted-Library否則 warning
  • Java 7u40 -必須包含Trusted-Library否則 warning
  • Java 7u45 (OK)
  • Java 7u55 (OK)


另外javascript調用applet時,必須與主要Jar文件位於一個地址上。

Caller-Allowable-Codebase: host.example.com 127.0.0.1 

 

1.7.55中當單獨使用*作爲Caller-Allowable-Codebase值時,從javascript中調用applet會顯示安全警告框,用戶可選擇允許和阻止,同時提供一個選項來記住用戶操作,如果選擇記住操作,RIA啓動時就不再會顯示警告框。



6僅受信屬性Trusted-Only Attribute

用來阻止未受信的類文件或資源被applet加載。這個屬性設爲true可阻止使用未受信的組件,因此需要對所有類文件和組件簽名並使用all-permissions。

Trusted-Only:true

 

7受信庫屬性Trusted-LibraryAttribute

用來設計applet允許未受信的組件,當applet加載未受信的類文件或資源時不會彈出警告對話框。這個屬性設爲true可阻止使用未受信的組件,因此需要對所有類文件和組件簽名並使用all-permissions。在混合代碼的applet中,所有特權類和資源都必須有Trusted-Library屬性,這是用來在特權代碼和沙盒代碼間相互調用。

 

如果web站點的證書無效,JRE驗證web站點不受信任時會彈出警告對話框且無法隱藏,並告知站點證書無效,臨時使用時,可點擊“繼續”按鈕。

 

如果簽名文件的證書無效,會彈出警告框且無法隱藏。臨時使用時點擊我接受風險並希望運行此應用程序。

當證書無效或者Caller-Allowable-Codebase:爲*,javascript調用applet時會提示警告框,臨時使用時可點擊“是”,

1.7.55增加了記住選項可記住默認操作。

 

經過測試和驗證,解決彈框問題有五個方法:

第一個JRE降到1.7.25以前。

第二個java認可的CA數字簽名。

        效果如http://docs.oracle.com/javase/tutorial/deployment/applet/deployingApplet.html

第三個客戶端添加自簽名證書庫和證書。

        添加applet證書到簽名者CA,避免未知發行者警告。

第四個windows操作系統下導入證書到受信任的根證書頒發機構,該操作只對IE瀏覽器有效。

第五個修改用戶%APPDATA%的javaSecurity目錄下trust.cacert文件。

       

添加web站點證書到安全站點證書,建議web站點證書與applet證書一致,避免Web站點連接不可信警告。

       

添加applet證書到可信的證書,可以避免運行提示框。

 

參考:

1Java與數字簽名

http://www.blogjava.net/sylilzy/articles/javaadndigtalsign.html

2oracle官方的java數字簽名後的插件

http://docs.oracle.com/javase/tutorial/deployment/applet/deployingApplet.html

3oracle增強的安全屬性

http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#codebase

4oracle官方Manifest

http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/manifest.html#codebase

5oracle官方7u45發佈

http://www.oracle.com/technetwork/java/javase/7u45-relnotes-2016950.html

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章