简介
java 运行环境的策略指定了来自各种来源的代码可以获得何种权限,由 policy 对象表示。缺省 policy 实现从静态 ascii 策略配置文件获得其信息。
可借助于纯文本编辑器或者借助于本文档所描述的图形化 policy tool 实用程序来撰写策略文件。使用 policy tool 可节省键入时间,并且使得用户不必知道策略文件所需语法,从而减少了错误的发生。
本文档中的权限和策略文件概述一节描述了权限是什么,并且提供了有关策略文件内容和缺省策略文件的信息。该节还提供了到这些主题的详细讨论的链接。
policy tool 用法一节描述了如何使用 policy tool 来创建和修改策略文件。
示例一节提供了 policy tool 用法的详细示例。
另请参阅一节提供了到相关文档的链接。
权限和策略文件概述
本节简要地描述了权限是什么,并且提供了有关策略文件内容和缺省策略文件的信息。
权限
权限代表对系统资源的访问。为了让 applet(或与安全管理器一起运行的应用程序)能够进行资源访问,必须将相应的权限明确地授予试图进行访问的代码。
权限通常具有一个名称(常称为“目标名”),而且在某些情况下,还具有一个由逗号分隔开的一个或多个动作的序列。例如,如果要创建权限来读
/tmp/目录中名为“abc”的文件,则需要用目标名“/tmp/abc”和动作字符串“read”来创建 file permission(其术语为 java.io.filepermission 权限)。在缺省策略实现中,必须用策略配置文件中的“策略项”(有时称为“授权项”)来将指定权限授予试图读该文件的代码。可以使用 policy tool 在这样的文件中创建这样的项。
jdk 1.2 中的权限文档所含的一些表格描述了内置 jdk 1.2 权限类型并且讨论了授予各种权限的危险程度。该文档中所含的另外一些表格显示了需要权限生效才能成功工作的 jdk 1.2 方法,并且对应于每一种方法都列出了所需权限。
缺省策略文件及其位置
缺省情况下只有一个全系统策略文件,以及一个可选的用户策略文件。
系统策略文件的缺省位置为
java.home/lib/security/java.policy其中,java.home 表示 jdk 的安装目录。
用户策略文件的缺省位置位于
user.home/.java.policy其中,user.home 表示用户的宿主目录。
当策略初始化时,首先加载系统策略,然后再添加用户策略。如果既没有系统策略又没有用户策略,则使用内置策略。这种内置策略与最初的沙箱策略相同。
策略文件位置是在安全属性文件中指定的,该文件位于
java.home/lib/security/java.security将策略文件位置作为属性的值来指定,其名称具有以下形式:
policy.url.n其中,
n表示数字。用户可以在以下形式的语句行中指定每个属性值:policy.url.n=url其中,url是 url 说明。例如,缺省策略文件(有时又分别称为“系统”和“用户”策略文件)在安全属性文件中的定义分别为
policy.url.1=file:${java.home}/lib/security/java.policy policy.url.2=file:${user.home}/.java.policy注意: 当在策略文件或安全属性文件中出现象
${some.property}这样的字符串时,它将被扩展为指定系统属性的值。例如:
${java.home}表示的是指定 jdk 安装目录的 java.home 属性的值
安全属性文件中的“policy.expandproperties”属性值控制是否允许属性扩展。如果该属性值为 true(缺省值),则允许扩展。
实际上用户可以在安全属性文件中指定多个 url(包括“http://”形式的 url),所有指定的策略文件都将加载。也可以注释掉或更改第二个 url 以禁止读取缺省用户策略文件。
算法从 policy.url.1 开始,并且不断递增直到找不到 url 为止。因此,如果您有 policy.url.1 和 policy.url.3,则决不会读取 policy.url.3。
当调用应用程序时,还可以指定附加的或另外的策略文件。这可以借助于“-djava.security.policy”命令行参数来完成,该命令行参数设置 java.security.policy 属性的值。例如,如果键入以下语句,其中 purl 是指明策略文件的位置的 url,则在加载安全属性文件中所指定的所有策略文件以外,还加载该 url 指定的策略文件。
java -djava.security.manager -djava.security.policy=purl someapp(“-djava.security.manager”参数确保了缺省安全管理器的安装,这样就可以对应用程序进行策略检查。如果应用程序 someapp 安装了安全管理器,则该参数就不是必需的。)
如果键入的是以下语句(使用的是双重等号),则仅使用指定的策略文件;而其它所有策略文件都将被忽略。
java -djava.security.manager -djava.security.policy==purl someapp如果您想要将策略文件传递给 appletviewer,则请如下所示再次使用“-djava.security.policy”参数:
appletviewer -j-djava.security.policy=purl myapplet请注意: 如果安全属性文件中的“policy.allowsystemproperty”属性被设置为 false,则将忽略 “-djava.security.policy”策略文件值(对于 java 和 appletviewer 命令)。缺省值为 true。
策略文件内容
策略配置文件(简称为策略文件)指明来自指定代码源的代码可以获得何种权限。
策略配置文件中包含有许多项。可以包含唯一的“密钥仓库”项,包含零个或多个“策略”(或“授权”)项。
密钥仓库 是私钥及其相关数字证书(例如认证相应公钥的 x.509 证书链)的数据库。使用 keytool 实用程序来创建和管理密钥仓库。策略配置文件中所指定的密钥仓库的作用是查询该文件的授权项所指定的签名人(如果有)的公钥。而公钥的作用则是校验用于对代码进行签名的数字签名。
如果有任何策略项指定了签名人别名,则策略配置文件中必须出现密钥仓库项。
此时,策略文件中只能有一个密钥仓库项。密钥仓库项指定密钥仓库的 url 位置,有时也指定密钥仓库类型。url 相对于策略文件的位置。因而,如果在安全属性文件中以如下方式指定策略文件:
policy.url.1=http://foo.bar.com/blah/some.policy而且该策略文件含有值为“.keystore”的密钥仓库项,则将从以下位置加载密钥仓库:
http://foo.bar.com/blah/.keystoreurl 也可以是绝对 url。