贴上两篇文章,希望对你有所帮助1. Intranet中用Policy文件设置Java的安全策略 本文提出了使用安全策略文件来设置Java程序权限的一种简单的方法。由于企业内部网中各台计算机的位置、用途和安全性明确,更适于使用安全策略文件来设置Java的权限,软件的安装、设置、升级和迁移都非常方便,并且,还可以和数字签名配合使用,更重要的是,可以细分每个Java程序的权限,使用起来灵活方便。 
一、Java中安全策略的概念
----Java应用程序环境的安全策略,详细说明了对于不同的代码所拥有的不同资源的许可,它由一个Policy对象来表达。为了让applet(或者运行在 SecurityManager下的一个应用程序)能够执行受保护的行为,例如读写文件,applet(或 Java应用程序)必须获得那项操作的许可,安全策略文件就是用来实现这些许可。 
----Policy对象可能有多个实体,虽然任何时候只能有一个起作用。当前安装的Policy对象,在程序中可以通过调用getPolicy方法得到,也可以通过调用setPolicy方法改变。Policy对象评估整个策略,返回一个适当的Permissions对象,详细说明哪些代码可以访问哪些资源。 ---- 策略文件可以储存在无格式的ASCII文件或Policy类的二进制文件或数据库中。本文仅讨论无格式的ASCII文件的形式。 二、Policy文件的格式
----为了能够更好地理解下面的内容,建议在阅读时参照 \jdk1.2\jre\lib\security\java.policy文件和\jdk1.2\jre\lib\security\java.security文件的内容。 
----Policy文件的语法格式与说明 ----一个Policy文件实质上是一个记录列表,它可能含有一个 “keystore”记录,以及含有零个或多个“grant”记录。其格式如下: keystore “some_keystore_url", “keystore_type";grant [ SignedBy “signer_names" ] [ , CodeBase “URL" ] {
    Permission permission_class_name [ “target_name"  ] 
               [ , “action"] [, SignedBy “signer_names" ];
    Permission ...
};----(1)“keystore"记录 ----一个keystore是一个私有密钥(private keys)数据库和相应的数字签名,例如X.509证书。Policy文件中可能只有一条keystore记录(也可能不含有该记录),它可以出现在文件中grant记录以外的任何地方。Policy配置文件中指定的 keystores用于寻找grant记录中指定的、签名者的公共密钥(public keys),如果任何grant 记录指定签名者(signer_names),那么,keystore记录必须出现在policy配置文件中。 ----“some_keystore_url"是指keystore的URL位置, “keystore_type"是指keystore的类型。第二个选项是可选项,如果没有指定,该类型则假定由安全属性文件(java.security)中的“keystore.type"属性来确定。keystore类型定义了 keystore信息的存储和数据格式,用于保护keystore中的私有密钥和keystore完整性的算法。 Sun Microsystems支持的缺省类型为“JKS”。 ---- (2)“grant"记录 ----在Policy文件中的每一个grant记录含有一个CodeSource (一个指定的代码)及其permission(许可)。 ----Policy文件中的每一条grant记录遵循下面的格式,以保留字“grant”开头,表示一条新的记录的开始,“Permission”是另一个保留字,在记录中用来标记一个新的许可的开始。每一个grant记录授予一个指定的代码(CodeBase)、一套许可(Permissions)。 ----permission_class_name必须是一个合格并存在的类名,例如java.io.FilePermission,不能使用缩写(例如,FilePermission)。 ----target_name用来指定目标类的位置,action用于指定目标类拥有的权限。 ----target_name可以直接指定类名(可以是绝对或相对路径)、目录名,也可以是下面的通配符: directory/*  目录下的所有文件
*     当前目录的所有文件
directory/-  目录下的所有文件,包括子目录
-      当前目录下的所有文件,包括子目录
<< ALL FILES >>文件系统中的所有文件----对于java.io.FilePermission,action可以是:read, write, delete和execute。 ----对于java.net.SocketPermission,action可以是:listen, accept,connect,read,write。 ---- (3)Policy文件中的属性扩展(Property Expansion)属性扩展与shell中使用的变量扩展类似,它的格式为:
“${some.property}" ----实际使用的例子为:
permission java.io.FilePermission
“${user.home}", “read"; ----“${user.home}"的值为“d:\Project",因此,下面的语句和上面的语句是一样的:
permission java.io.FilePermission “d:\Project ", “read"; 三、实 例
----当初始化Policy时,首先装载系统Policy,然后再增加用户Policy,如果两者都不存在,则使用缺省的Policy,即原始的沙箱模型。 
----系统Policy文件的缺省位置为:
{java.home}/lib/security/java.policy (Solaris)
{java.home}\lib\security\java.policy (Windows) ----用户Policy文件的缺省位置为:
{user.home}/.java.policy (Solaris)
{user.home}\.java.policy (Windows) ----其实,在实际使用中,我们可能不会像上面介绍的那么复杂,特别是在不使用数字签名时。这时,我们完全可以借鉴JDK 1.2提供给我们的现成的 \jdk1.2\jre\lib\security\java.policy文件,根据我们的需要做相应的修改,本文就针对不使用数字签名情况详细说明安全策略文件的用法。 ----下面,是一个完整的在Windows 95/98/NT下使用的.java.policy文件。在文件中,分别使用注释的形式说明了每个“permission”记录的用途。 // For LanServerTalk.java and LanClientTalk.javagrant { 
  //对系统和用户目录“读”的权限
  permission java.util.PropertyPermission “user.dir", “read";
  permission java.util.PropertyPermission “user.home", “read";
  permission java.util.PropertyPermission “java.home", “read";
  permission java.util.PropertyPermission “java.class.path", “read";
  permission java.util.PropertyPermission “user.name", “read";   //对线程和线程组的操作权限
  permission java.lang.RuntimePermission “modifyThread";
  permission java.lang.RuntimePermission “modifyThreadGroup";   //操作Socket端口的各种权限
   permission java.net.SocketPermission “-", “listen";
   permission java.net.SocketPermission “-", “accept";
   permission java.net.SocketPermission “-", “connect";
   permission java.net.SocketPermission “-", “read";
   permission java.net.SocketPermission “-", “write";   //读写文件的权限
   permission java.io.FilePermission “-", “read";
   permission java.io.FilePermission “-", “write";   //退出系统的权限,例如System.exit(0)
   permission java.lang.RuntimePermission “exitVM";
};四、.Java.policy文件的使用
---- 对于Windows 95/98/NT,使用.Java.policy文件的方法主要有下面两种。 
----1. 使用缺省目录 ---- 我们可以简单地将编辑好的.Java.policy文件拷贝到 Windows 95/98/NT的HOME目录,这时,所有的applet(或Java应用程序)可能都拥有某些相同的权限,使用起来简单,但不灵活(例如:对于Java.io.FilePermission ,其目标类的 target_name必须使用绝对路径),如果不是在企业内部网中使用,还可能存在一定安全隐患。 ---- 2. 在命令行中指定 ---- 在命令行,如果我们希望传递一个Policy文件给 appletviewer,还可以使用“-J-Djava.security.policy"参数来指定policy的位置: appletviewer -J-Djava.security.policy=pURL  myApplet----pURL为Policy文件的位置。下面,是一个实际的例子,以当前目录的.java.policy文件所指定的安全策略运行当前目录的LanServerTalk.html(文件中装载并运行LanServerTalk.Java):  appletviewer -J-Djava.security.policy
          =.Java.policy LanServerTalk.html ----这种方法使用灵活,特别是作为一个软件包在企业内部网中发布时,安装、设置和迁移软件,基本无须修改Policy文件的内容,使用起来相当简单,而且,安全许可的范围控制较精细。

解决方案 »

  1.   

    2.   Java2下Applet数字签名具体实现方法Applet的数字签名认证实现的具体方法、步骤 
    结合我自己开发的基于JAVA2的Applet 
     
    我的项目是使用APPLET制作一个实时消息队列监控程序,由于涉及到了本地资源,对APPLET一定要进行数字签名和认证。我使用的环境是WINDOWS2000,应用服务器是WEBLOGIC6.0,开发环境是JBUILDER4.0。之前我提醒大家一定要注意服务器端和客户端的概念。那些文件应该在服务器端,那些文件应该在客户端。 
    首先在客户端使用JRE1.3.0_01(JAVA运行环境1.3.0.1版本)以取代IE的JVM(JAVA虚拟机),可以到WWW.JAVA.SUN.COM网站上去下载,下载好了先在客户端安装好,安装过程非常简单。 
    在服务器端的调用APPLET的HTML文件中也需要将它包含进来,以便没有事先安装JRE的客户端下载,具体的写法,请接着往下看; 
     
    具体步骤如下:  
     
    服务器端: 
    1.将程序需要用到的各种包文件全部解压(我这儿要用到WEBLOGIC的JMS包使用命令jar xf weblogicc.jar),然后使用JDK的打包命令将编译好的监控程序.class和刚才解压的包一起打包到一个包中。(前提我已经将监控程序和解开的包都放在同一个目录下了),都是dos状态下的命令,具体命令见jdk1.3(1.2)的bin目录下, 
    命令如下: 
    jar cvf monitor.jar *.class 
    此命令生成一个名为monitor.jar的包 
    2.为刚才创建的包文件(monitor.jar)创建keystore和keys。其中 
    keystore将用来存放密匙(private keys)和公共钥匙的认证,alias别名这儿取为monitor。 
    命令如下: 
    keytool -genkey -keystore monitor.keystore –alias monitor 
    此命令生成了一个名为monitor.keystore的keystore文件, 
    接着这条命令,系统会问你好多问题,比如你的公司名称,你 
    的地址,你要设定的密码等等,都由自己的随便写。  
    3.使用刚才生成的钥匙来对jar文件进行签名 
    命令如下: 
    jarsigner -keystore monitor.keystore monitor.jar monitor 
    这个命令将对monitor.jar文件进行签名,不会生成新文件。  
    4.将公共钥匙导入到一个cer文件中,这个cer文件就是要拷贝到客户端的唯一文件 。 
    命令如下: 
    keytool -export -keystore monitor.keystore -alias monitor -file monitor.cer 
    此条命令将生成monitor.cer认证文件,当然这几步都有可能问你刚 
    才设置的密码。 
    这样就完成了服务器端的设置。这时你就可以将jar文件和keystore文件以及cer文件(我这儿是monitor.jar,monitor.keystore,monitor.cer)拷贝到服务器的目录下了,我用的是weblogic6.0,所以就拷贝到C:\bea\wlserver6.0\config\mydomain\applications\DefaultWebApp_myserver下的自己建的一个目录下了。  
     
    客户端: 
    1. 首先应该安装jre1.3.0_01,然后将服务器端生成的monitor.cer 
    文件拷贝到jre的特定目录下,我这儿是: 
    c:\program files\javasoft\jre\1.3.0_01\lib\security目录下。 
    2. 将公共钥匙倒入到jre的cacerts(这是jre的默认keystore) 
    命令如下: 
    keytool -import -alias monitor -file monitor.cer  
    -keystore cacerts 
    注意这儿要你输入的是cacerts的密码,应该是changeit,而不 
    是你自己设定的keystore的密码。 
    3. 修改policy策略文件,在dos状态下使用命令 policytool 
    系统会自动弹出一个policytool的对话框,如图4所示,在这里面首先选择file菜单的open项, 
    打开c:\program files\javasoft\jre\1.3.0_01\lib\security目录下的java.poliy文件,然后在edit菜单中选择Change keystore ,在对话框中new keystore url:中输入 
    file:/c:/program files /javasoft/jre/1.3.0_01/lib/security/cacerts, 
    这儿要注意反斜杠,在new keystore type 中输入JKS,这是cacerts的固定格式,然后单击Add Policy Entry,在出现的对话框中CodeBase中输入: 
    http://URL:7001/* 
    其中的URL是服务器的IP地址,7001是我的weblogic的端口,如果你是在别的应用服务器上比如说是apache,那端口号就可以省略掉。 
    在SignedBy中输入(别名alias):这儿是Monitor 
    然后单击add peimission按钮,在出现的对话框中permission中选择你想给这个applet的权限,这儿具体有许多权限,读者可以自己找资料看看。我这儿就选用allpeimission,右边的signedBy中输入别名:monitor 
    最后保存,在file菜单的save项。 
    当然你可以看见我已经对多个包实现了签名认证。 
     
     
     
     
    这样客户端的设置就完成了。在客户端用ie运行该applet程序时,会询问你是不是对该签名授权,选择授权后,包会自动从服务器下载到本地计算机,而且ie会自动启动jre,在右下栏中可以看见,相当于ie的java控制台。 
     
    4.调用applet的html文件 
    大家都知道由于java2的安全性,对applet的正常调用的html文件已经不能再使用了,而改为ActiveX类型的调用。具体的又分ie和nescape的不同写法,这一些在sun网上都能找到现成的教程。我就不多说了,只是将我的这个小程序为ie写的的html给大家看看。 
    <html> 
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=gb2312">  
    <center> 
    <h3>消息中心实时监控平台</h3> 
    <hr> 
    <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
    width="900" height="520" align="baseline" codebase="http://192.168.2.217:7001/j2re-1_3_0_01-win-i.exe#Version=1,3,0,0"> 
    <PARAM NAME="java_code" VALUE="wise.monitor.applet.monitorApplet"> 
    <PARAM NAME="java_codebase" VALUE="monitor/classes">  
    <PARAM NAME="java_type" VALUE="application/x-java-applet;version=1.3"> 
    <PARAM NAME="ARCHIVE" VALUE="monitor.jar" > 
    <PARAM NAME="scriptable" VALUE="true"> 
    </OBJECT>  
    </center> 
    </html>