一. applet中的数字签名 1
1 前言 2
2 计算机环境 2
3 客户端需求 2
4 编译 2
5 打包 2
6 调用applet的HTML页面 2
7 准备签名代码 3
8 签名代码 4
9 运行Applet 4
二. 用jbuilder2005对applet进行数字签名 1
I. 数字证书的生成 1
II. 打包 2
III. 指定资源文件 3
IV. 签名Applet的目标JAR文件 4
V. 引用Applet包文件 6
三. 解决applet中的网络访问问题
1 前言
我们知道Java Applet程序在运行的时候受到安全限制,例如不能够访问本地文件系统,不能够随意访问网络.,不能访问数据库。下面将介绍如何对代码做数字签名,让客户在运行时选择是否信任你的签名,使开发的程序具有更多的权限。在这里不打算购买证书。
2 计算机环境
Windows2000 professional sp3
SUN JDK1.4.0
IE6.0
JAVA_HOME、PATH、CLASSPATH等环境变量均已设置
3 客户端需求
客户端浏览器需要安装Java插件,这里的Java插件是安装JDK时一起安装的。如果客户端不需要做Java开发,可以去下载SUN的网站下载JRE到客户端安装。
4 编译
在与softphone目录的父目录编译这个Applet
javac softphone *.java
5 打包
jar -cvf softPhone.jar softphone
用jbuilder开发工具自带的打包功能
6 调用applet的HTML页面
<applet
archive="softPhone.jar"
codebase = "."
code = "softphone.gui.class"
name = "TestApplet"
width = "660"
height = "110"
hspace = "0"
vspace = "0"
align = "middle"
>
</applet>
7 准备签名代码
首先用keytool命令产生用来签名的key。下面这个命令产生一个叫"mykey"的key,它存储在我们新建的叫"mystore"的keystore中。
keytool -genkey -alias mykey -keystore mystore
接下来它会问一些问题包括keystore的密码,key的密码等,如下所示:
输入keystore密码: storepass
您的名字与姓氏是什么?
[Unknown]: liu
您的组织单位名称是什么?
[Unknown]: XX公司
您的组织名称是什么?
[Unknown]: XX公司
您所在的城市或区域名称是什么?
[Unknown]: aa
您所在的州或省份名称是什么?
[Unknown]: sh
该单位的两字母国家代码是什么
[Unknown]: CN
CN=AYellow, OU=我的组织单位, O=我的组织, L=北京, ST=北京, C=CN 正确吗?
[否]: Y
输入<mykey>的主密码
(如果和 keystore 密码相同,按回车): keypass
完成后会在当前目录下生成一个叫mystore的文件,这个文件包含了我们的key。
8 签名代码
用jarsigner命令签名我们的代码test.jar(需要输入keystore和key的密码):
jarsigner -keystore mystore test.jar mykey
Enter Passphrase for keystore: storepass
Enter key password for mykey: keypass
9 运行Applet
运行Applet,在Applet加载的时候会出现一个对话框,说该Applet由不可信任的发行者签名并宣称代码是安全的,是不是要对Applet授权。选择"授权于会话",就可以进行软电话操作.
二. 用jbuilder2005对applet进行数字签名 1
I. 数字证书的生成
在JBuilder的Applet打包向导中仅需要一个数字证书,向导会为最终的JAR包生成消息摘要、消息验证码并签名。通过JDK自带的Keytool工具可以为生成一个数据证书,这个工具位于JDK的bin目录下。
打开DOS命名窗口,定位到JBuilder 2005下自带的JDK的bin目录下,执行下面的Keytool命名生成一张自己的证书:
C:\Borland\JBuilder2005\jdk1.4\bin>keytool -genkey -alias chenxhCA - keyalg RSA -keystore superCALib -validity 3650
命令窗口将要求你输入一些个人信息
这里我们使用keytool工具生成了一个名为chenxhCA的证书,它存放到superCALib证书库中,有效期为10年,使用的加密算法上RSA。证书库superCALib的访问密码是123456,而chenxhCA证书条目的访问密码是123123。在输入作为发送者身份标识的信息后就会在当前目标,即C:\Borland\JBuilder2005\jdk1.4\bin下生成一个名为superCALib的证书库文件。
keytool参数较多,使用也比较复杂,详细使用说明,请参见Sun网站的帮助文档:
一般情况下你还需要将该证书发给权威的CA签名,这个证书才会被视为合法的证书,当然你也可以模拟创建一个CA证书,用这个CA证书为我们将用于签发Applet的chenxhCA证书签名,为了简单起见我们忽略这一步。
II. 打包
现在已经万事俱备了,我们可以开始利用JBuilder的打包向导将Applet所以文件打包并签名的过程。
1) File->New...->Archive,在Archive页中双击Applet JAR图标启动Applet打包向导。
2) 在向导第1步中指定Applet JAR的名字和保存到目标文件,
为了加速网络下载速度,我们勾选上Compress the contents of the archive选项,压缩JAR文件,减小文件的体积。Always create archive when building the project选项使用每次编辑工程时都重新创建Applet JAR包。点击Next到下一步。
III. 指定资源文件
指定JAR文件中所需包含的资源文件
由于TypeTrainApplet程序引用了3张图片,所以JAR文件除包含TypeTrainApplet.class程序文件外,还需要将用于按钮图标的文件选择进来
按Next到下一步。
注意:
当你指定game.TypeTrainApplet.class,start.gif,pause.gif,stop.gif,hit.wav时,打成的Applet JAR包将不能正确运行,那些和TypeTrainApplet类位于同一程序文件的事件监听器类将被排除在外,所以需要通过game/*.*来打包。
IV. 签名Applet的目标JAR文件
由于向导第3~6步,我们不需要作特别的设置,所以一直按Next到第7步。
在这一步里,我们用上一小节中生成的数字证书签名Applet的目标JAR文件
稤igitally sign this archive选项在默认的情况下是未选中的,首先勾选该选项
点击稫eystore后的…按钮,选择我们刚才在C:\Borland\JBuilder2005\jdk1.4\bin目录下所生成的superCALib证书库文件。
在稫eystore password中输入123456,即证书库的密码。
点击稟lias后的…按钮,由于我们在superCALib证书库中仅有一个chenxhca证书,所以在弹出的Select Alias对话框的Available Alias列表中仅有一个chenxhca选项,选择chenxhca证书。
在稟lias password中输入123123,即chenxhca证书的私钥密码。
在稴tore type中输入JKS,由于Keytool工具的默认证书库类型是JKS,所以superCALib的类型为JKS。
在设置完以后的信息后,按Finish结束向导,在工程窗格的资源树中将出现一个TypeTrainJAR的节点。右击这个节点,在弹出的菜单中选择Rebuild,JBuilder将创建Applet的JAR包,并用chenxhca证书签名。
Rebuild完成后,工程窗格的Applet JAR节点就可以展开了,展开这个节点,我们发现目标JAR文件中除了资源文件以外,在META-INF文件夹下还有3个文件
META-INF文件夹下的3个文件是和数字签名有关的文件,说明如下:
MANIFEST.MF:这个 manifest 文件定义了与扩展和包相关的数据。
MONITOR.SF:这是 JAR 文件的签名文件,文件名标识了签名者。
MONITOR.DSA:与签名文件相关联的签名程序块文件,它存储了用于签名 JAR 文件的公共签名。
V. 引用Applet包文件
我们现在来更改TypeTrainApplet.html中<applet>的属性使其通过JAR来引用Applet程序。这个过程很简要,打开TypeTrainApplet.html文件,切换到Source视图页中,将光标定位在<applet>标签中。窗口右边出现<applet>标签的属性输入编辑器,在archive中输入game.JAR,按回车
JBuilder为<applet>标签添加archive的属性。由于game.JAR文件位于工程根目录下,而TypeTrainApplet.html文件位于工程目录的classes子文件夹下,所以需要将TypeTrainApplet.html拷贝到工程根目录下,这样archiver="game.JAR "的属性声明才是正确的,因为在寻找程序资源时,是以TypeTrainApplet.html所在目录为相对路径的。
保存后,到工程目录下双击TypeTrainApplet.html文件,IE检测到网页中包含了经过签名的Applet程序,弹出一个安全警告的对话框
由于我们的证书没有经过权威机构的签名认证,所以对话框提示"此安全证书是由不可信的公司签发的"信息。需要指出的是游览器的JRE版本不同,弹出的警告对话框并不相同,上图是JRE版本为1.5.0时的警告对话框。
可以通过点击"更多详细信息"按钮查看证书的信息
点选"签发人"项,将可以看到证书执有者的个人信息。关闭这个对话框,回到 "警告-安全"对话框中,点击"是"接受这个签名的Applet。IE就对这个Applet开放了安全权限,不再受沙盒模型的限制了。
弹出因网络断开,或启用防火墙而出现的对话框.
通过加强数字签名解决。
解决问题的方法:
在C:\soft\jdk\jre\lib\security\java.policy中加入
grant {
permission java.net.SocketPermission "*", "connect,accept,resolve";
permission java.net.SocketPermission "*:1024-65535", "listen,accept,connect";
};
</script>