这些Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改了解Java SE 9及后续版本中更新的语言功能的摘要。
请参阅JDK发布说明了解有关所有JDK版本的新功能、增强功能以及删除或弃用选项的信息。
你可以使用JAR签名和验证工具来签名JAR文件并对签名进行时间戳。你可以通过使用jarsigner命令来调用JAR签名和验证工具,因此我们简称它为"Jarsigner"。
要签名一个JAR文件,你首先需要一个私钥。私钥及其相关的公钥证书存储在受密码保护的数据库中,称为密钥库。密钥库可以保存多个潜在签名者的密钥。密钥库中的每个密钥都可以通过别名来识别,该别名通常是拥有该密钥的签名者的名称。例如,属于Rita Jones的密钥可能具有别名"rita"。
签名JAR文件的基本命令形式为
jarsigner jar-file alias
在这个命令中:
Jarsigner工具会提示您输入密钥库和别名的密码。
这个基本命令假设要使用的密钥库在您的主目录中的一个名为.keystore的文件中。它将创建具有名称x.SF和x.DSA的签名和签名块文件,其中x是别名的前八个字母,全部转换为大写。这个基本命令将覆盖原始的JAR文件,并用签名后的JAR文件替换。
在实践中,您可能希望使用一些可用的命令选项。例如,鼓励时间戳签名,以便部署您的应用程序的任何工具都可以验证用于签名JAR文件的证书在签名文件时是有效的。如果没有包含时间戳,Jarsigner工具会发出警告。
选项位于jar-file路径名之前。下表描述了可用的选项:
选项 | 描述 |
---|---|
-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文件进行签名的示例。在这些示例中,我们将假设以下情况:
http://tsa.url.example.com
。在这些假设下,您可以使用以下命令对名为app.jar的JAR文件进行签名:
jarsigner -keystore mykeys -tsa http://tsa.url.example.com app.jar johndoe
您将被提示输入密钥库和别名的密码。因为这个命令没有使用-sigfile选项,它创建的.SF和.DSA文件将被命名为JOHNDOE.SF和JOHNDOE.DSA。因为该命令没有使用-signedjar选项,所以生成的签名文件将覆盖原始版本的app.jar。
让我们看看如果您使用不同的选项组合会发生什么:
jarsigner -keystore mykeys -sigfile SIG -signedjar SignedApp.jar -tsacert testalias app.jar johndoe
签名和签名块文件将分别命名为SIG.SF和SIG.DSA,签名的JAR文件SignedApp.jar将放置在当前目录中。原始的未签名JAR文件将保持不变。此外,签名将使用TSA的公钥证书testalias进行时间戳。
JAR签名和验证工具的完整参考页面在线上:安全工具摘要