六 安全管理
6.1 管理Applet和應用(Application)
當前,所有Java 2 SDK的系統代碼都調用SecurityManager方法來檢查當前生效的規則和執行訪問控制檢查。無論何時一個applet運行的時候,都會有一個安全管理者(SecurityManager的實現)被註冊;appletviewer和大多數瀏覽器,包括網景和微軟出品的哪些,都會註冊一個安全管理者。而當一個應用(application)執行的時候,一個安全管理者不會被自動註冊。爲了對一個在本地文件系統中的應用施加和從網上下載的applets相同的安全規則,或者運行該程序的用戶使用新增加的命令行參數"-Djava.security.manager"(設置參數java.security.manager的值)來啓動Java虛擬機,如
java -Djava.security.manager SomeApp
或者在應用內部調用java.lang.System的setSecurityManager方法來註冊一個安全管理者。在命令行中指定使用一個定製的安全管理者是可能的,通過在"-Djava.security.manager"後面跟一個等號以及該特殊安全管理者的類名,如
java -Djava.security.manager=COM.abc.MySecMgr SomeApp
如果沒有指定安全管理者,那麼使用內置默認的安全管理者(除非應用自己註冊了一個不同的安全管理者)。下面的命令行都是等效的,會使用默認的安全管理者:
java -Djava.security.manager SomeApp
java -Djava.security.manager="" SomeApp
java -Djava.security.manager=default SomeApp
Java 2 SDK包含了一個叫java.class.path的屬性。本地文件系統中的類如果不應該按照基礎類(如集成在SDK中的類)對待,那麼應該放在該路徑裏。在這個路徑裏的類會被一個安全類加載器加載,這樣會受到正在執行的安全規則的約束。
還有一個命令行參數"-Djava.security.policy",可決定哪些規則文件被使用。該命令行參數在“3.3.5 默認的系統和用戶規則文件”章節中詳細描述過。基本上,如果你在命令行中不包含"-Djava.security.policy",則定義在安全屬性文件(security properties file)中的規則文件將被使用。
啓動應用程序時,你可以使用一個命令行參數"-Djava.security.policy"來指定一個額外的或不同的規則文件。例如,如果你打出下面的命令行,其中pURL是一個指定規則文件位置的URL,然後這個規則文件就會被加載並添加到在安全屬性文件中配置的那些規則文件後面:
java -Djava.security.manager -Djava.security.policy=pURL SomeApp
如果你打出下面的命令行,使用一個雙等號,那麼只有該命令行中指定的規則文件會被使用;所有其他規則文件都會被忽略:
java -Djava.security.manager -Djava.security.policy==pURL SomeApp
6.2 SecurityManager對比AccessController
新的訪問控制機制是完全向後兼容的。例如,所有SecurityManager中的檢查方法都仍然可用,雖然它們的絕大部分實現都改爲調用SecurityManager的checkPermission方法,該方法的默認實現調用了AccessController的checkPermission方法。注意有一些內部的安全檢查可能仍然保留在SecurityManager中,除非它能參數化。當前,我們沒有將任何的系統代碼從調用SecurityManager(並檢查類加載器是否存在)修訂爲調用AccessController,因爲可能存在的繼承SecurityManager並定製check方法的第三方應用。實際上,我們增加了一個新方法SecurityManager.checkPermission,該方法默認簡單的調用AccessController.checkPermission。
要想理解SecurityManager和AccessController之間的關係,瞭解到以下內容就足夠了:SecurityManager代表了一箇中央訪問控制點的概念,而AccessController實現了一個詳細的帶有如doPrivileged這樣的特殊規範的訪問控制算法。通過到目前爲止仍然保留SecurityManager,我們維護了向後兼容性(例如,對於那些實現了自己的安全管理器類的基於早期版本JDK的應用)和伸縮性(例如,對於那些想通過定製安全模型來實現受託訪問控制或層級安全的應用)。通過提供AccessController,我們將我們認爲最有限制力和在大部分場景下能減輕開發者編寫大量安全代碼負擔的算法內置進去。
我們鼓勵在應用代碼中使用AccessController,而對一個安全管理器的定製(通過繼承)應該是在極其謹慎的情況下最後要訴諸的辦法。此外,一個定製的安全管理器,例如在調用標準安全檢查之前總是檢查時間的安全管理器,如果合適的話可以而且應該使用AccessController提供的算法。
需要記住的一件事是,當你實現了你自己的SecurityManager,你應該將其註冊爲受信任的軟件並給予它java.security.AllPermission。有幾種方法可以做到:
- 你可以將你自己的SecurityManager註冊爲一個擴展程序,因爲所有的擴展程序默認都被賦予AllPermission。想要更多信息,查看課程:創建和使用擴展程序。
- 你可以調整規則文件,給予你的SecurityManager以AllPermission許可。想要更多信息,查看默認規則實現和規則文件語法。
6.3 輔助工具
本節簡要介紹三個可以輔助新安全特徵實施的工具的用法。未來,這些工具可能會被打包到一起。6.3.1 密鑰和證書管理工具
keytool是一個密鑰和證書管理工具。它使用戶能夠管理他們自己的公鑰/私鑰對和相應的用於自我身份證明(用戶向別的用戶/服務證明是他/她本人)或數據的完整和認證服務的證書,使用數字簽名。認證信息包括一個X.509證書鏈和一個相應的私鑰,可被一個所謂的“別名”所引用。本工具也管理證書(被用戶信任的),與認證信息保存在同樣的數據庫中,可以被一個“別名”所引用。keytool將密鑰和證書保存在一個所謂的keystore中。默認的keystore實現將keystore實現爲一個文件。它使用一個密碼來保護密鑰。
X.509證書鏈是由一個叫做認證機構(或CAs)的機構頒發的。實體(包括CAs)使用他們的私鑰來將自己的身份關聯在對象(如使用SSL的安全通道)上,關聯在他們簽發的代碼存檔上,或者(對於CAs)關聯在他們頒發的X.509證書上。作爲一個起步工具,使用genkey命令生成的證書可能會一直使用,直到從認證機構申請一個證書鏈爲止。
在該庫中的私鑰總是保存爲加密格式,這增加了不恰當暴露這些私鑰的難度。訪問和修改該數據庫需要密碼。這些私鑰使用密碼來加密,密碼應該有幾個字長。如果密碼丟了,那麼這些認證密鑰無法被恢復。
實際上,keystore中每一個私鑰都可以使用它自己的密碼來加以保護,跟保護整個keystore安全的密碼可以一樣也可以不一樣。
該工具(當前)打算通過命令行來使用,通過在shell中簡單的打出“keytool”。keytool是一個執行了合適的Java類的腳本,並隨着SDK一起構建。
對每個命令的命令行選項可以任意順序給出。打出一個不正確的選項或者打出"keytool -help"都會導致在終端上展示工具的用法總結,如下所示。
% keytool -help
KeyTool usage:
-certreq [-v] [-alias <alias>] [-sigalg <sigalg>]
[-file <certreq_file>] [-keypass <keypass>]
[-keystore <keystore>] [-storepass <storepass>]
[-storetype <i>storetype</i>]
-delete [-v] -alias <alias>
[-keystore <keystore>] [-storepass <storepass>]
[-storetype <i>storetype</i>]
-export [-v] [rfc] [-alias <alias>] [-file <cert_file>]
[-keystore <keystore>] [-storepass <storepass>]
[-storetype <i>storetype</i>]
-genkey [-v] [-alias <alias>] [-keyalg <keyalg>]
[-keysize <keysize>] [-sigalg <sigalg>]
[-dname <distinguished_name>] [-validity <valDays>]
[-keypass <keypass>] [-keystore <keystore>]
[-storepass <storepass>]
[-storetype <i>storetype</i>]
-help
-identitydb [-v] [-file <idb_file>] [-keystore <keystore>]
[-storepass <storepass>]
[-storetype <i>storetype</i>]
-import [-v] [-noprompt] [-alias <alias>]
[-file <cert_file>] [-keypass <keypass>]
[-keystore <keystore>] [-storepass <storepass>]
[-storetype <i>storetype</i>]
-keyclone [-v] [-alias <alias>] -dest <dest_alias>
[-keypass <keypass>] [-new <new_keypass>]
[-keystore <keystore>] [-storepass <storepass>]
[-storetype <i>storetype</i>]
-keypasswd [-v] [-alias <alias>]
[-keypass <old_keypass>] [-new <new_keypass>]
[-keystore <keystore>] [-storepass <storepass>]
[-storetype <i>storetype</i>]
-list [-v | -rfc] [-alias <alias>]
[-keystore <keystore>] [-storepass <storepass>]
[-storetype <i>storetype</i>]
-printcert [-v] [-file <cert_file>]
-selfcert [-v] [-alias <alias>] [-sigalg <sigalg>]
[-dname <distinguished_name>] [-validity <valDays>]
[-keypass <keypass>] [-keystore <keystore>]
[-storepass <storepass>]
[-storetype <i>storetype</i>]
-storepasswd [-v] [-new <new_storepass>]
[-keystore <keystore>] [-storepass <storepass>]
[-storetype <i>storetype</i>]
6.3.2 可視化規則工具PolicyTool
PolicyTool是一個圖形化用戶接口(如下截圖所示),用於輔助一個用戶(例如系統管理員)指定,創建,編輯,導出,或導入一個安全規則。該工具通過命令行policytool來啓動。它同樣是一個執行了合適的Java類(非公開類)的腳本,並隨着SDK一起構建。查看PolicyTool文檔以獲得用法信息和帶最新截圖的例子。文檔可以在policytool.html文件中找到,該文件的位置是
/docs/technotes/tools/unix/
或者/docs/technotes/tools/windows/
目錄位於SDK的安全目錄內(在Windows系統上文件分隔符實際上是反斜槓)。
6.3.3 JAR簽名和核實工具
jarsigner工具可以用來數字簽名JAR文件,並覈實這種簽名。該工具,像PolicyTool一樣,基於keytool管理的keystore。其用法快速總結如下。% jarsigner
Usage: jarsigner [options] jar-file alias
jarsigner -verify [options] jar-file
[-keystore <url>] keystore file location
[-storepass <password>] password for keystore integrity
[-keypass <password>] password for private key (if different)
[-sigfile <file>] name of .SF/.DSA file
[-signedjar <file>] name of signed JAR file
[-verify] verify a signed JAR file
[-verbose] verbose output when signing/verifying
[-certs] display certificates when verbose and verifying
[-internalsf] include .SF file inside signature block
[-sectionsonly] don't compute hash of entire manifest
再一次,該工具是一個隨着SDK一起構建的腳本。注意,預期在不久的將來該工具會和已存在的jar工具腳本合併,形成一個單一的原生命令行工具來創建JAR包,無論是簽名還是非簽名的。
===========================================================================
本技術文檔的翻譯工作由不動明王1984獨自完成,特此聲明。
翻譯辛苦,珍惜勞動,引用時請註明出處!
===========================================================================
上一篇:Java Security Architecture--Java安全體系技術文檔翻譯(五)
下一篇:Java Security Architecture--Java安全體系技術文檔翻譯(七)