java是安全的,所以在提供了applet对浏览器进行扩展来实现更为强大的功能的同时,又使用了沙箱安全模型(sandbox security model)对applet进行限制。在沙箱安全模型的限制下,applet不能访问客户端机器的文件以及进行任何能够破坏客户端机器的操作,但是在安全的同时,它也相应地减弱了applet的功能。于是为了能够发挥applet的强大功能并且又不至于伤害到客户端机器,java提供了对applet进行数字签名(digital signature)的方法。浏览器对applet的数字签名支持并没有一个统一的标准,但是一些著名的浏览器如ie和navigator对进行数字签名的applet都可以开放大部分的权限。
1、建立一个例子文件,在这里使用thinking in java中一个例子的简化版,它是用来客户端机器上的一个文件,并且显示出来文件的内容:
//fileaccessapplet.java
// <applet code="fileaccessapplet" width="500" height="500"></applet>
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class fileaccessapplet extends japplet {
private jtextfield
filename = new jtextfield(),
dir = new jtextfield();
private jbutton open = new jbutton("open");
private jeditorpane ep = new jeditorpane();
private jscrollpane jsp = new jscrollpane();
private file file;
public void init() {
jpanel p = new jpanel();
open.addactionlistener(new openl());
p.add(open);
container cp = getcontentpane();
jsp.getviewport().add(ep);
cp.add(jsp, borderlayout.center);
cp.add(p, borderlayout.south);
dir.seteditable(false);
ep.setcontenttype("text/html");
filename.seteditable(false);
p = new jpanel();
p.setlayout(new gridlayout(2, 1));
p.add(filename);
p.add(dir);
cp.add(p, borderlayout.north);
}
class openl implements actionlistener {
public void actionperformed(actionevent e) {
jfilechooser c = new jfilechooser();
c.setfilefilter(new textfilefilter());
// demonstrate "open" dialog:
int rval = c.showopendialog(fileaccessapplet.this);
if(rval == jfilechooser.approve_option) {
file = c.getselectedfile();
filename.settext(file.getname());
dir.settext(c.getcurrentdirectory().tostring());
try {
system.out.println("url is " + file.tourl());
ep.setpage(file.tourl());
// ep.repaint();
} catch (ioexception ioe) {
throw new runtimeexception(ioe);
}
}
if(rval == jfilechooser.cancel_option) {
filename.settext("you pressed cancel");
dir.settext("");
}
}
}
public class textfilefilter extends
javax.swing.filechooser.filefilter {
public boolean accept(file f) {
return f.getname().endswith(".txt")
|| f.isdirectory();
}
public string getdescription() {
return "text files (*.txt)";
}
}
}
当在appletviewer中运行这个程序时,会出现如图1所示的界面,这是如果点击“open”按钮,就会在控制台上报“java.security.accesscontrolexception”的异常,如图2 。因为这个程序需要客户端机器上的文件,而普通的applet是不允许访问的,于是就会产生异常。这时就要进行数字签名。
图1
图2
2、生成jar包。在进行数字签名以前,需要将进行前面的applet和以及资源文件打包,这时可以用java的jar进行打包,生成jar文件。使用如下命令:jar cf fileaccessapplet.jar cn/mblogger/mydeman/sign/*.class,于是生成了fileaccessapple.jar。
3、进行数字签名。如果从一个有认证权的机构获得证书,需要付费,并且要持续的定时的更新。因此,在大多数情况下,我们可以使用一个自签名的证书,这个证书存储在你的电脑上的某个地方。java自带了keytool工具来生成数字签名的信息,当键入:keytool -list时,keytool就会在默认的目录下寻找这个文件(.keystore),一半情况下这个文件在%java_home%/jre/lib/security中,名称为cacerts。下面利用cacerts生成自己的签名信息,并且进行对上面生成fileaccessapplet.jar进行签名。(1)将这个文件复制f盘下,更名为mydeman――当然也可以为其他目录和名称;(2)在命令行中键入:keytool ?cgenkey ?calias <keyname> -keystore <url>,其中keyname是签名信息的别名,url是认证文件所在的路径,例如:keytool -genkey -alias mykey -keystore f:/mydeman。接着出现“输入keystore密码:”的提示,这个密码是cacerts的密码,这个密码默认是changeit,键入密码,接着提示输入“名字和姓氏”、“组织单位名称”等信息,一一输入后,询问提示是否正确,输入“y”回车。最后让输入签名信息的主密码,这里和keystore相同。自此就建立了自己的签名信息。以上过程如图3所示。(4)对fileaccessapplet.jar进行签名。对jar进行签名的命令是:jarsigner ?ckeystore <url> <jarfile> <keyname>,其中url意义同上,keyname就是刚刚建立签名信息的名字,jarfile就是需要签名的jar包。这里是:jarsigner -keystore f:/mydeman f:/artices/fileaccessapplet.jar myname,提示输入keystore密码,输入changeit回车,即可完成对fileaccessapplet.jar的签名。

图3
4、测试签名后的applet。建立测试程序,如下:
<html>
<head>
<title>fileaccessapplet 测试程序</title>
</head>
<body>
<applet code="fileaccessapplet.class" archive="fileaccessapplet.jar" width="500" height="500"></applet>
</body>
</html>
运行这个上面的程序,会出现确认如图4所示,确认签名信息的提示,点击“是”,就可以看到如图5所示的结果。如果需要查看证书的详细信息可以点击“更详细信息”。

图4

图5
到这里,就完成了对一个applet的签名,但是会发现,即使已经签过名的applet在客户端还是会对用户进行提示,让其确认。如果要想获得一个高级别的认证证书话,只有通过商业的途径。
闽公网安备 35060202000074号