文档

Java™教程
隐藏目录
签名JAR文件
路径: 部署
教程: 将程序打包为JAR文件
章节: 签名和验证JAR文件

签名JAR文件

你可以使用JAR签名和验证工具来签名JAR文件并对签名进行时间戳。你可以通过使用jarsigner命令来调用JAR签名和验证工具,因此我们简称它为"Jarsigner"。

要签名一个JAR文件,你首先需要一个私钥。私钥及其相关的公钥证书存储在受密码保护的数据库中,称为密钥库。密钥库可以保存多个潜在签名者的密钥。密钥库中的每个密钥都可以通过别名来识别,该别名通常是拥有该密钥的签名者的名称。例如,属于Rita Jones的密钥可能具有别名"rita"。

签名JAR文件的基本命令形式为

jarsigner jar-file alias

在这个命令中:

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

这个基本命令假设要使用的密钥库在您的主目录中的一个名为.keystore的文件中。它将创建具有名称x.SFx.DSA的签名和签名块文件,其中x是别名的前八个字母,全部转换为大写。这个基本命令将覆盖原始的JAR文件,并用签名后的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文件将保持不变。此外,签名将使用TSA的公钥证书testalias进行时间戳。

其他信息

JAR签名和验证工具的完整参考页面在线上:安全工具摘要


注意: 当证书是自签名时,应用程序的发布者将显示为UNKNOWN。更多信息,请参阅从列为UNKNOWN的发布者运行应用程序是否安全?

上一页:了解签名和验证
下一页:验证已签名的JAR文件