转载自:https://www6.software.ibm.com/developerworks/cn/education/java/j-sec1/tutorial/j-sec1-8-5.html
代码签名的概念
JAR 文件在 Java 平台上相当于 ZIP 文件,允许将多个 Java 类文件打包到一个具有 .jar 扩展名的文件中。然后,可以对这个 JAR 文件进行数字签名,以证实其中的类文件代码的来源和完整性。该 JAR 文件的接收方可以根据发送方的签名决定是否信任该代码,并可以确信该内容在接收之前没有被篡改过。JDK 提供了带有这种功能的 jarsigner 工具。
在部署中,可以通过在策略文件中放置访问控制语句根据签名者的身份分配对机器资源的访问权。
jarsigner 工具
jarsigner 工具将一个 JAR 文件、一个私钥和相应的证书作为输入,然后生成 JAR 文件的签名版本作为输出。它为 JAR 文件中的每个类计算消息摘要,然后对这些摘要进行签名以确保文件的完整性并标识文件的拥有者。
在 applet 环境中,HTML 页面引用已签名 JAR 文件中包含的类文件。当浏览器接收这个 JAR 文件时,会对照任何安装的证书或认证中心的公用签名检查该 JAR 文件的签名以验证其有效性。如果未找到现有的证书,则会向用户显示一个提示屏幕,给出证书详细信息并询问用户是否打算信任该代码。
代码签名示例
在本示例中,我们首先从 .class 文件创建 JAR 文件,然后通过在用于签名的密钥库中指定证书的别名来对 JAR 文件签名。然后,我们对已签名的 JAR 文件运行验证检查。
D:\IBM>jar cvf HelloWorld.jar HelloWorld.class
added manifest
adding: HelloWorld.class(in = 372) (out= 269)(deflated 27%)
D:\IBM>jarsigner HelloWorld.jar JoeUserKey
Enter Passphrase for keystore: password
D:\IBM>jarsigner -verify -verbose -certs HelloWorld.jar
137 Mon Apr 15 12:38:38 CDT 2002 META-INF/MANIFEST.MF
190 Mon Apr 15 12:38:38 CDT 2002 META-INF/JOEUSERK.SF
938 Mon Apr 15 12:38:38 CDT 2002 META-INF/JOEUSERK.RSA
0 Mon Apr 15 12:38:00 CDT 2002 META-INF/
smk 372 Mon Apr 15 12:33:02 CDT 2002 HelloWorld.class
X.509, CN=Joe User, OU=Security, O="Company, Inc.", L=User City,
ST=MN, C=US (joeuserkey)
s = signature was verified
m = entry is listed in manifest
k = at least one certificate was found in keystore
i = at least one certificate was found in identity scope
jar verified.
代码签名示例执行
下面是用于该程序的 HTML:
<HTML>
<HEAD>
<TITLE> Hello World Program </TITLE>
</HEAD>
<BODY>
<APPLET CODE="HelloWorld.class" ARCHIVE="HelloWorld.jar"
WIDTH=150 HEIGHT=25>
</APPLET>
</BODY>
</HTML>
当在将 Java 插件用作 Java 虚拟机的浏览器中执行这个示例时,会弹出一个对话框询问用户是否希望安装和运行由“Joe User”分发的已签名的 applet,并告知用户发布者的可靠性是由“Company,Inc.”验证的,但安全性结论是由一家未获信任的公司发出的。该安全性证书还未过期并仍然有效。它警告:“Joe User”断言该内容是安全的,仅当您相信“Joe User”所作的断言时才应该安装或查看其内容。向用户提供了下列选项:
* 准许这个会话
* 拒绝
* 始终准许
* 查看证书