Java Security Architecture--Java安全体系技术文档翻译(六)

返回目录

六 安全管理

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。有几种方法可以做到:

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安全体系技术文档翻译(七)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值