文档

Java™ 教程-Java Tutorials 中文版
签名 JAR 文件
Trail: Deployment
Lesson: Packaging Programs in JAR Files
Section: Signing and Verifying JAR Files

签名 JAR 文件

你可以使用 JAR 签名和验证工具对 JAR 文件进行签名并为签名添加时间戳。你可以使用 jarsigner 命令调用 JAR 签名和验证工具,因此我们将其简称为“Jarsigner”。

要签署 JAR 文件,你必须首先拥有私钥。私钥及其关联的公钥证书存储在名为 keystores 的受密码保护的数据库中。密钥库可以容纳许多潜在签名者的密钥。密钥库中的每个密钥都可以通过 alias (别名) 来标识,该别名通常是拥有密钥的签名者的名称。例如,属于 Rita Jones 的密钥可能具有别名“rita”。

用于签名 JAR 文件的命令的基本形式是

jarsigner jar-file alias

在此命令中:

Jarsigner 工具将提示你输入密钥库和别名的密码。

此命令的这种基本形式假定要使用的密钥库位于主目录中名为 .keystore 的文件中。它将分别创建名称为 x.SFx.DSA 的签名和签名块文件,其中 x 是别名的前八个字母,全部转换为大写。此基本命令将使用签名的 JAR 文件 overwrite (覆盖) 原始 JAR 文件。

实际上,你可能希望使用一个或多个可用的命令选项。例如,鼓励为签名添加时间戳,以便用于部署应用程序的任何工具都可以验证用于签署 JAR 文件的证书在签名文件时是否有效。如果未包含时间戳,则 Jarsigner 工具会发出警告。

选项位于 jar-file 路径名之前。下表介绍了可用的选项:

Jarsigner 命令选项
选项 描述
-keystore url 如果你不想使用 .keystore 默认数据库,则指定要使用的密钥库。
-sigfile file 如果你不希望从别名中获取基本名称,请指定 .SF 和 .DSA 文件的基本名称。file 必须仅由大写字母(A-Z),数字(0-9),连字符( - )和下划线(_)组成。
-signedjar file 如果不希望使用签名文件覆盖原始未签名文件,则指定要生成的已签名 JAR 文件的名称。
-tsa url 使用 URL 标识的时间戳机构(TSA)为签名生成时间戳。
-tsacert alias 使用由 alias (别名) 标识的 TSA 公钥证书为签名生成时间戳。
-altsigner class 表示使用备用签名机制为签名添加时间戳。完全限定的类名标识使用的类。
-altsignerpath classpathlist 提供由 altsigner 选项标识的类的路径以及该类所依赖的任何 JAR 文件。

例子

让我们看一下使用 Jarsigner 工具签名 JAR 文件的几个示例。在这些示例中,我们将假设以下内容:

在这些假设下,你可以使用此命令对名为 app.jar 的 JAR 文件进行签名:

jarsigner -keystore mykeys -tsa http://tsa.url.example.com app.jar johndoe

系统将提示你输入密钥库和别名的密码。由于此命令不使用 -sigfile 选项,因此它创建的 .SF 和 .DSA 文件将命名为 JOHNDOE.SFJOHNDOE.DSA。由于该命令不使用 -signedjar 选项,因此生成的签名文件将覆盖 app.jar 的原始版本。

让我们来看看如果使用不同的选项组合会发生什么:

jarsigner -keystore mykeys -sigfile SIG -signedjar SignedApp.jar 
          -tsacert testalias app.jar johndoe

签名和签名块文件将分别命名为 SIG.SFSIG.DSA,签名的 JAR 文件 SignedApp.jar 将放在当前目录中。原始的未签名 JAR 文件将保持不变。此外,签名将带有标记为 testalias 的 TSA 公钥证书的时间戳。

额外信息

JAR 签名和验证工具的完整参考页面是在线的:Summary of Security Tools


注意: 证书自签名后,UNKNOWN 将显示为应用程序的发布者。有关详细信息,请参阅 Is it safe to run an application from a publisher that is listed as UNKNOWN?

Previous page: Understanding Signing and Verification
Next page: Verifying Signed JAR Files