示例
我们的示例很简单:客户端调用 LogService 提供的 API,把 Message 写入到磁盘文件。
清单 1. 客户端程序
package sample.permtest.client;
……
public class Client {
……
public static void main(String[] args) {
//构造消息日志,使用LogService将其写入c:\\paper\\client\\out.tmp文件。
Message message = new Message("c:\\paper\\client\\out.tmp",
"Hi, this is called from client"+''\n'');
LogService.instance.log(message);
//构造消息日志,使用LogService将其写入c:\\paper\\server\\out.tmp文件。
message = new Message("c:\\paper\\server\\out.tmp",
"Hi, this is called from client"+''\n'');
LogService.instance.log(message);
}
}
清单 2. LogService
package sample.permtest.server;
……
public class LogService {
……
public void log(Message message) {
final String destination = message.getDestination();
final String info = message.getInfo();
FileWriter filewriter = null;
try
{
filewriter = new FileWriter(destination, true);
filewriter.write(info);
filewriter.close();
}
catch (IOException ioexception)
{
ioexception.printStackTrace();
}
}
}
基于Java 2运行时安全模型的线程协作(3)
时间:2009-11-09 IBM 李三红
如清单 1、2 所示,这就是一个普通的 Java 应用程序。我们把这个程序放在 Java 的安全模型中执行。Client 类放在 client.jar JAR 包里,而 LogService 类放在 server.jar JAR 包里
首先我们使用 keytool 工具来生成我们需要的 keystore 文件,以及需要的数字证书,如清单 3 所示。
清单 3. 生成 keystore 文件及其数字证书
>keytool -genkey -alias client -keyalg RSA -keystore C:\paper\.keystore
>keytool -genkey -alias server -keyalg RSA -keystore C:\paper\.keystore
在清单 3 中,我们生成了 C:\paper\.keystore 文件,使用 RSA 算法生成了别名为 client 与 server 的两个数字证书。(注 : 为方便起见,keystore 与 client,server 证书的密钥都是 111111)
我们使用如清单 4 所示的命令来签名 client.jar 与 server.jar。
清单 4. 签名 JAR 文件
>jarsigner.exe -keystore C:\paper\.keystore
-storepass 111111 c:\paper\client.jar client
>jarsigner.exe -keystore C:\paper\.keystore
-storepass 111111 c:\paper\server.jar server
在清单 4 中,我们使用了别名为 client 的数字证书来签名 client.jar 文件,使用别名为 server 的数字证书来签名 server.jar 文件。
使用图形化的工具 policytool.exe 创建清单 5 所示的 Policy 文件。
清单 5. Policy 文件
/* AUTOMATICALLY GENERATED ON Thu May 14 15:40:25 CST 2009*/
/* DO NOT EDIT */
keystore "file:////C:/paper/.keystore";
grant signedBy "client" {
permission java.io.FilePermission "c:\\paper\\client\\*","read,write";
};
grant signedBy "server" {
permission java.security.AllPermission;
};
Policy 文件指出,所有被”client”签名的代码具有读写” c:\\paper\\client\\”目录下所有文件的权限,而所有被”server”签名的代码具有所有的权限。Java 将根据该策略文件按照签名者创建相应的保护域。
一切就绪,我们运行代码,如清单 |