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 |
http://a.example.com |
www.example.com |
https://www.example.com, http://www.example.com |
http://example.com |
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 |
http://example.net |
127.0.0.1 |
http://127.0.0.1 |
http://localhost |
127.0.0.1:8080 |
http://127.0.0.1:8080 |
http://127.0.0.1 |
代碼庫屬性必須與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否則 warningJava 7u25-必須包含Trusted-Library否則 warningJava 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