JavaTM安全体系结构(JDK1.2)
6. 安全性管理
6.1 管理Applet和应用程序
目前,所有JDK系统代码都是调用SecurityManager方法以检查现行策略并进行访问控制检查。不管一个Applet是在何时运行,都典型地安装一个安全管理器(SecurityManager实现);appletviewer和大多数浏览器(包括Netscape和Microsoft的浏览器)都安装了安全管理器。
当运行一个应用程序时,安全管理器不能被自动安装。为了象运行下载的Applet一样将同样的安全策略应用于一个在本地文件系统中的应用程序,运行该应用程序的用户必须使用新的 "-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
JDK1.2包括一个名为java.class.path的属性。那些被存储在本地文件系统但不被当作基础类的类应该在这个路径下。在这个路径下的类用安全类装载器来装载,并且符合当前推行的安全策略。
还有一个 "-Djava.security.policy"命令行自变量,它的用法决定了应采用什么样的策略文件。这个命令行自变量在"缺省系统和用户策略文件"一节中详述。一般来说,如果你在一个命令行中未包括 "-Djava.security.policy",则在安全属性文件中所指定的策略文件将被使用。
当调用一个应用文件的执行时,你可以使用一个"-Djava.security.policy" 命令行自变量来指定一个附加的或不同的策略文件。举例如下:如果你键入以下命令行(这里的pURL是一个指定策略文件位置的URL),除了所有在安全属性中指定的策略文件外,上述由URL所指定的策略文件也将被装载。
java -Djava.security.manager -Djava.security.policy= pURL SomeApp
如果你不这样做,而是使用如下命令,即使用双等号来代替上面的单等号,则只有指定的策略文件被使用,其它策略文件将被忽略:
java -Djava.security.manager -Djava.security.policy = = pURL SomeApp
6.2 SecurityManager和AccessController
新的访问控制机制是全部向后兼容的。例如,在SecurityManager中的所有check方法仍然被支持(尽管它们的大多数实现已被变为调用新的SecurityManager 中的checkPermission方法,它们的缺省实现调用AccessController 的checkPermission方法)。注意:某些内部安全检查可能驻留在SecurityManager类中,除非它能被参数化。
到目前为止,我们还没有修改任何JDK代码系统以调用AccessController来代替调用SecurityManager(和检查类装载器的存在),这是由于现有的第三方应用程序可能创建SecurityManager子类并使check方法用户化。事实上,我们增加了一个新的方法SecurityManager.checkPermission,它缺省地直接调用AccessController.checkPermission。
为了理解SecurityManager和AccessController之间的关系,需注意:SecurityManager代表了一个访问控制的核心概念,而AccessController是实现一个特定的访问控制算法(利用例如doPrivileged方法这样一些特殊的性质)。通过保持SecurityManager的不断更新,我们维护向后兼容性(例如,兼容那些基于早期JDK版本而编写他们自己的安全管理器类的应用程序)和灵活性(例如,某些程序员希望客户化安全模式以实现强制性存取控制和多层安全控制)。通过提供AccessController,我们内置了算法。我们认为该算法是最具约束性的并且可以解脱了程序员在许多情况下不得不编写大量安全代码的重负。
我们鼓励在应用程序代码中使用AccessController, 用户化安全管理器(通过建立子类)应该是最后一种手段,并且在做时应格外小心。另外,一个用户化的安全管理器(如在调用标准安全检查之前都要检查当日时间的管理器)应该也能够利用由AccessController在任何适当的时候提供的算法。
6.3 辅助工具
这一节将简单地介绍三种有助于部署新的安全性能的工具。这些工具有可能在将来打包到一起。
有关这些工具更详尽的文本可在JDK发布目录的子目录中找到:
/doc/tooldocs/solaris 和 /doc/tooldocs/win32
这里的路径分隔符在Windows系统中实际是 "\"。
例如:如果JDK被安装在Solaris系统中一个名为 "/jdk1.2"的目录中,那么,为Solaris用户和Windows用户的keytool文本则分别在下列目录中:
/jdk1.2/docs/tooldocs/solaris/keytool.html
/jdk1.2/docs/tooldocs/win32/keytool.html
如果JDK被安装在Windows系统中一个名为 "C:\jdk1.2"的目录中,那么,为Solaris用户和Windows用户的keytool文本则分别在下列目录中:
C:\jdk1.2\docs\tooldocs\solaris\keytool.html
C:\jdk1.2\docs\tooldocs\win32\keytool.html
6.3.1 密钥和证书管理工具
keytool是一个密钥和证书管理工具。它使用户可以自己管理自己的公共/私有密钥对及相关的用来自我认证(自我认证是用户向其他用户/服务进行自我身份说明)的证书,或使用数字签字来管理数据完整性及认证服务。认证信息既包括X.509证书的序列(链)和一个相关的私有密钥(它可被所谓的"别名"来引用)。这个工具还可以管理证书(它是被用户所"信任"的),这些证书作为认证信息存储在同一个数据库中,并且可被"别名"来引用。
keytool在一个所谓的keystore中存储密钥和证书。缺省keystore是以文件形式来实现的。它用口令来保护私有密钥。
X.509证书的链是由一个被称为认证中心 (或CA) 的组织所提供的。身份(包括CA)使用他们的私有密钥来认证他们与对象(如使用SSL保护的通道)的关联、与他们所签署的代码文档的关联或与他们所发布的X.509证书(包括CA)的关联等。作为一种"解铃"工具,使用-genkey命令所生成的证书可能被使用到一个认证中心返回一个证书链为止。
在这个数据库中的私有密钥总是以加密的形式存储,它使得这些私有密钥很难被非法得到。访问或修改数据库需要口令。这些私有密钥是使用"口令"来加密的,它可能有几个词那样长。如果口令被丢失,则那些认证密钥将不能被恢复。
事实上,每个在keystore中的私有密钥都可以使用它自己的口令进行保护,它与保护keystore总的口令可能相同,也可能不同。
这个工具是要在(在目前情况下)命令行中使用。在命令行中,你可以将"keytool" 作为一个命令而直接键入。keytool是一个可执行Java类的命令文件,它与JDK被建在一起。
该命令的选项,可以任何顺序提供。不正确的选项或键入 "keytool -help"会在输出设备上(如一个外壳Window)输出该一个工具用法小结。如下所示:
% keytool -help
KeyTool usage:
-certreq [-v] [-alias ] [-sigalg ] [-file ] [-keypass ] [-keystore ] [-storepass ] [-storetype storetype] -delete [-v] -alias [-keystore ] [-storepass ] [-storetype storetype] -export [-v] [rfc] [-alias ] [-file ] [-keystore ] [-storepass ] [-storetype storetype] -genkey [-v] [-alias ] [-keyalg ] [-keysize ] [-sigalg ] [-dname ] [-validity ] [-keypass ] [-keystore ] [-storepass ] [-storetype storetype] -help -identitydb [-v] [-file ] [-keystore ] [-storepass ] [-storetype storetype]-import [-v] [-noprompt] [-alias ] [-file ] [-keypass ] [-keystore ] [-storepass ] [-storetype storetype] -keyclone [-v] [-alias ] -dest [-keypass ] [-new ] [-keystore ] [-storepass ] [-storetype storetype] -keypasswd [-v] [-alias ] [-keypass ] [-new ] [-keystore ] [-storepass ] [-storetype storetype] -list [-v | -rfc] [-alias ] [-keystore ] [-storepass ] [-storetype storetype]-printcert [-v] [-file ] -selfcert [-v] [-alias ] [-sigalg ] [-dname ] [-validity ] [-keypass ] [-keystore ] [-storepass ] [-storetype storetype] -storepasswd [-v] [-new ] [-keystore ] [-storepass ] [-storetype storetype] 6.3.2 策略工具 策略工具是一个图形用户界面(如屏幕图形所示),它帮助用户(如系统管理员)指定、生成、编辑、输出或输入一个安全策略。该工具从命令行作为policytool被调用。这又是一个命令文件,它与JDK建在一起来调用适当的(非公共的)实现类。 详细信息请看策略工具用法信息的有关文本和最新的屏幕图形。上述文本存储在policytool.html文件中,在如下路径: /docs/tooldocs/solaris/ 或 /docs/toodocs/win32/ 这里的文件分隔符在Windows系统中实际是反斜线。
6.3.3 JAR签字和校验工具 jarsigner工具可被用来数字地签署Java文档(JAR文件)并校验这个签字。与策略工具相似,这个工具依赖于由keytool管理的keystore。它的用法可快速小结如下: % jarsignerUsage: jarsigner [options] jar-file alias jarsigner -verify [options] jar-file [-keystore ] keystore file location [-storepass ] password for keystore integrity [-keypass ] password for private key (if different) [-sigfile ] name of .SF/.DSA file [-signedjar ] 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这个工具也是与JDK建在一起的命令文件。我们希望这个工具和jar工具命令能够在将来合并,以形成一个单一的用来创建JARs的(签字或不签字的)命令行原语。 ..........|Next|..........欢迎与我们联系:webmaster@prc.sun.com
版权所有 1997-1998 Sun(中国)公司,北京南礼士路66号建威大厦16层
All rights reserved.Legal Terms