Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
你可以使用 JAR 签名和验证工具对 JAR 文件进行签名并为签名添加时间戳。你可以使用 jarsigner 命令调用 JAR 签名和验证工具,因此我们将其简称为“Jarsigner”。
要签署 JAR 文件,你必须首先拥有私钥。私钥及其关联的公钥证书存储在名为 keystores 的受密码保护的数据库中。密钥库可以容纳许多潜在签名者的密钥。密钥库中的每个密钥都可以通过 alias (别名) 来标识,该别名通常是拥有密钥的签名者的名称。例如,属于 Rita Jones 的密钥可能具有别名“rita”。
用于签名 JAR 文件的命令的基本形式是
jarsigner jar-file alias
在此命令中:
Jarsigner 工具将提示你输入密钥库和别名的密码。
此命令的这种基本形式假定要使用的密钥库位于主目录中名为 .keystore 的文件中。它将分别创建名称为 x.SF 和 x.DSA 的签名和签名块文件,其中 x 是别名的前八个字母,全部转换为大写。此基本命令将使用签名的 JAR 文件 overwrite (覆盖) 原始 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 文件将保持不变。此外,签名将带有标记为 testalias 的 TSA 公钥证书的时间戳。
JAR 签名和验证工具的完整参考页面是在线的:Summary of Security Tools