给jar包进行数字签名文档
初二 记叙文 6168字 262人浏览 yangfengzhen1

copy Bookmark 文章转载至http://www.51testing.com/?226261

如何给jar 包进行数字签名

目的:

为了使Applet 或者Java Web Start 程序能够访问客户端本地资源,需要对Applet 或者JWS 程序jar 包进行数字签名,之后客户端打开Applet 或者JWS 程序的时候会提示是否允许该程序访问本地资源,用户如果要用你的程序,当然只能选择OK 了。这样你的程序就能按照某种访问权限来访问客户机的本地资源了。

签名步骤:

1. 将程序打成jar 包。

这个我就不多说了,用eclipse ,netbeans 等开发工具很方便就能打包的。

2. 用keytool 命令生成.store 文件。

在任意文件夹下建立一个keytool.bat 文件,输入

keytool -genkey -keystore xxx.keystore -alias xxx -validity 3650

保存, 双击执行。将在当前目录下生成一个xxx.keystore 文件, -alias 后接的是别名,-validity 后面接的是该证书有效天数,这里3650表示10年。(用这个证书签名的程序10年内有效)。

3. 用jarsigner 程序对jar 包进行签名。

新建jarsinger.bat 文件,输入

jarsigner -keystore xxx.keystore helloworld.jar xxx

这样helloworld.jar 就被签名了。

applet 应用程序的数字签名应用实战

最近在研究applet, 打算使用applet 来开发一个上传文件上传控件, 之前因为一直觉得applet 的沙箱控制导致applet 不能主动的访问客户端的资源, 所以也曾因此而放弃. 不过最近在研究applet 的签名后, 有了点收获, 可以通过签名jar 文档来达到这样的控制策略, 下面是我在实际实验过程中的一些心得和体会, 跟大家一起分享下.(注:如果转载此文, 请注明出处和作者, 尊重作者的劳动成果, 谢谢)

一、压缩你的class 类文件为jar 包

1. 假设你的需要压缩的类文件存在的包为:cn.mbq.test1和cn.mbq.test2

2. 进入你的classes 目录,在DOS 窗口中执行命令:jar cf mytest.jar cn.mbq.test1 cn.mbq.test2

3. 执行命令后你会在当前目录中找到mytest.jar 文件,这个就是刚才生成的档案文件。你可以修改它的后缀为rar ,然后使用winrar 压缩程序打开它查看看是否正确。

二、使用keytool 工具生成密匙库

1.keytool 工具位于${java_home}/bin目录下;

2. 在DOS 窗口中执行命令:keytool -genkey -keystore mytest.store -alias mbq

注意:mytest.store 是你的密匙库的名称,可以随意修改,后缀请不要修改! mbq 为别名,这个也可以改成自己的名称

3. 执行上述命令后,DOS 窗口中会提示你输入keystore 的密码、你的姓名、组织单位等等信息。这里要注意的是输入密码请记住,后面要用到的。在最后,我们输入y 确认信息。然后再直接回车设置mbq 的主密码和store 密码一致即可!

三、使用keytool 工具导出签名时用到的证书

1. 在DOS 窗口中执行命令:keytool -export -keystore mytest.store -alias mbq -file mbq.cert 注意:mytest.store 就是第二步生成的密匙库名称

mbq 也是在第二步中我们指定的别名

mbq.cert 为我们生成的证书的名称,可以自己修改名称,注意后缀不要改

2. 命令执行成功,我们会在当前目录下找到一个mbq.cert 文件,这个就是我们刚才生成的证书。

四、使用jarsigner 工具签名jar 压缩文档

1.jarsigner 工具位于${java_home}/bin目录下;

2. 在当前DOS 窗口中执行命令:jarsigner -keystore mytest.store mytest.jar mbq

注意:mytest.store 就是我们在第二步中生成的密匙库名称

mytest.jar 就是我们这第一步压缩的jar 文档

mbq 是提供者的名称,我们这里设置为我们的别名

五、创建mytest.policy 文件

1. 在当前目录下创建一个mytest.policy 文件,其内容如下:

keystore"file:mytest.store","JKS";

grantsignedBy"mbq"

{

permission java.io.FilePermission"<<ALLFILES>>","read";

};

2. 这个文件的意思就是说让所有由mbq 签名的applet 都可以对本地的所有文件进行读操作。

六、归档文件

通过上述的五个操作后,我们会在当前目录中找到如下几个文件:mytest.jar-签名后的jar 文档、mytest.store-密匙库、mbq.cert-证书、mytest.policy-访问策略文件。如果没有这些文件,那么你的applet 数字签名过程就没有正确的完成,请检查上述的操作。以后,如果对打包的java 文件做了修改,那么就需要重新签名一次才可以!

七、在网页中运行applet

1. 假设你的applet 中的主启动类为:cn.test.TestApplet.class ;整个前面生成的档案文件、证书啊存储在目录:d:\test\myapplet下;

2. 建立一applet_test.html文件存放在任何目录下都可以,然后内容如下:

Java 代码

1. 1 <HTML>...</HTML><HTML>

2. 2 <BODY>...</BODY><BODY>

3. 3 <APPLET CODEBASE="d:\test\myapplet" CODE="cn.test.TestApplet.class" ARCHIVE="mytest.jar" WIDTH=200 HEIGHT=100 name="myapp">

4. 4 </APPLET>

5. 5 </BODY>

6. 6 </HTML>

1 <HTML>...</HTML><HTML>

2 <BODY>...</BODY><BODY>

3 <APPLET CODEBASE="d:\test\myapplet" CODE="cn.test.TestApplet.class" ARCHIVE="mytest.jar" WIDTH=200 HEIGHT=100 name="myapp">

4 </APPLET>

5 </BODY>

6 </HTML>

注意:其中的CODEBASE 就是你的类的基础目录,CODE 也就是你的APPLET 的启动主类,ARCHIVE 也就是签名后的JAR 文档。

2. 然后在IE 中打开该html 文件,那么会看到IE 提示你是否信任该插件,也就是说我们的证书起作用了,然后确定运行后,就可以在页面上看到applet 的运行效果了。

但是由于SUN 和MS 的问题,目前IE 并不支持最新的JRE ,而是使用MS 自己开发的JRE ,所以这个也是影响APPLET 发展壮大的一个原因。而且正是由于这个原因,SUN 的java-plugin 技术才会出现。使用SUN 的java-plugin 技术我们就可以在applet 中使用最新的JAVA 类库了。由于IE 在遇到APPLET 标签的时候会调用自己的JRE ,但是如果客户机器上安装的JRE 不是我们想要的版本,那么就会出错了。所谓java-plugin 技术就是利用IE 的插件机制来制定我们想要的JRE ,我们可以在IE 中使用OBJECT 标签来调用APPLET ,这样就不会引用MS 的JRE 了,从而达到我们想要的效果,而且java-plugin 技术不仅仅支持IE ,还支持Navigator 等浏览器。不过我们需要编写比较复杂的HTML 代码了,但是这一且SUN 已经帮我们做到了,呵呵,在JDK1.4或更高的版本中SUN 提供了一个HtmlConverter.exe 工具来帮助将包含applet 标签的html 转换成包含OBJECT 和EMBED 标签的html 代码,该工具位于${java_home}/bin目录下,对于1.4以前的版本该工具则是单独提供的,不过现在几乎都是1.4或1.5甚至更高版本的JDK 了吧,呵呵。

该工具很简单,是图形化的工具,我们直接运行即可。比如我将上面的包含applet 的html 转换后(比如我选择只支持IE 的) ,其代码变成了如下:

Java 代码

1. 01 <HTML>...</HTML><HTML>

2. 02 <BODY>...</BODY><BODY>

3. 03

4. 04

5. 05 <object

6. 06 classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"

7. 07 codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,3"

8. 08 WIDTH = 200 HEIGHT = 100 NAME = "myapp" >

9. 09 <PARAM NAME = CODE VALUE = "cn.test.TestApplet.class" >

10. 10 <PARAM NAME = CODEBASE VALUE = "d:\test\myapplet" >

11. 11 <PARAM NAME = ARCHIVE VALUE = "mytest.jar" >

12. 12 <PARAM NAME = NAME VALUE = "myapp" >

13. 13 <param name = "type" value = "application/x-java-applet;version=1.5">

14. 14 <param name = "scriptable" value = "false">

15. 15 </object>

16. 16

21. 21

22. 22 </BODY>

23. 23 </HTML>

01 <HTML>...</HTML><HTML>

02 <BODY>...</BODY><BODY>

03

04

05 <object

06 classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"

07 codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,3"

08 WIDTH = 200 HEIGHT = 100 NAME = "myapp" >

09 <PARAM NAME = CODE VALUE = "cn.test.TestApplet.class" >

10 <PARAM NAME = CODEBASE VALUE = "d:\test\myapplet" >

11 <PARAM NAME = ARCHIVE VALUE = "mytest.jar" >

12 <PARAM NAME = NAME VALUE = "myapp" >

13 <param name = "type" value = "application/x-java-applet;version=1.5">

14 <param name = "scriptable" value = "false">

15 </object>

16

21

22 </BODY>

23 </HTML>

注意其中的OBJECT 标签,可以看到APPLET 标签已经被注释掉了。其中PARAM NAME=NAME这一行中的myapp 就是我们applet 应用程序的名称,在IE 提示的确认运行中显示的就是这个名称了,我们可以改为自己的公司或组织的名称。然后提示的提供者也就是我们在签名时用到的名称了。

另外,还要特别注意的就是这个包含OBJECT 标签的html 页面必须和你的mytest.jar 压缩文档放在同一个目录下,这样才可以正确的加载,否则会一直报ClassNotFound 的异常的,即使我们在OBJECT 标签中指定了CODEBASE 也不行,这个是我在测试的时候遇到的问题!

八、在Internet 上应用签名的applet

如果要把applet 部署在网络上,那么最好是采用OBJECT 标签的形式,同时也要兼顾采用EMBED 标签来支持诸如FF 等浏览器。我们把已签名了的mytest.jar 和我们的网页放在同一个目录下,至于其他的如mytest.store 和mbq.cert 可以不用放在一起,至少我在测试的过程中没有放到一起也不会出错,而且在不同的机器上运行的也非常好,可以读取客户端机器的资源!另外,也发现mytest.policy 其实也没什么用处,因为这是参考网络上的,而且他们的版本都是1.3左右,所以估计是版本低的缘故吧!

到此,我们就已经完成了applet 的签名到部署,以及到实际的网络应用中了。这样我们使用applet 来开发控件时就不会因为无法读取客户端资源而放弃了,呵呵~~