权限代表对系统资源的访问。为了让 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/.keystore
URL 也可以是绝对 URL。
密钥仓库类型定义密钥仓库信息的存储和数据格式,以及用于保护密钥仓库中的私钥和密钥仓库自身完整性的算法。如果您没有指定类型,则假定指定的是安全属性文件中的“keystore.type”属性值所指定的类型。该属性的缺省值为“JKS”,指定 Sun Microsystems 所支持的专用密钥仓库类型。
通常认为执行代码来自于特定的“代码源”。代码源不仅可以包括 applet(或应用程序)所始发自的 CodeBase 位置 (URL),而且还可以包括对一个或多个(符号的)别名的引用,这些别名所来自的密钥仓库指定的密钥仓库项包含与签名该代码的私钥相对应的公钥。
策略文件中的每个策略项都包含以下项目:
- 可选的 CodeBase 项,指定代码所始发自的 URL 位置,
- 可选的 SignedBy 项,指定来自密钥仓库的别名,作用是引用其私钥用于对代码进行签名的签名人,以及
- 一个或多个 权限 项,指定将何种权限授予来自指定 CodeBase 并由指定的 SignedBy 别名所签名的代码。