# 签署 JAR 文件

> 原文： [https://docs.oracle.com/javase/tutorial/deployment/jar/signing.html](https://docs.oracle.com/javase/tutorial/deployment/jar/signing.html)

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

要签署 JAR 文件，您必须首先拥有私钥。私钥及其关联的公钥证书存储在名为 _ 密钥库 _ 的受密码保护的数据库中。密钥库可以容纳许多潜在签名者的密钥。密钥库中的每个密钥都可以由 _ 别名 _ 标识，该别名通常是拥有密钥的签名者的名称。例如，属于丽塔琼斯的密钥可能具有别名“rita”。

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

```
jarsigner jar-file alias

```

在此命令中：

*   `jar-file` 是要签名的 JAR 文件的路径名。
*   `别名`是标识用于对 JAR 文件进行签名的私钥的别名，以及密钥的关联证书。

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

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

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

选项位于 `jar 文件`路径名之前。下表描述了可用的选项：

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

## 例

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

*   你的别名是“johndoe”。
*   要使用的密钥库位于当前工作目录中名为“mykeys”的文件中。
*   要用于为签名添加时间戳的 TSA 位于`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 签名和验证工具的完整参考页面在线：[安全工具摘要](https://docs.oracle.com/javase/8/docs/technotes/guides/security/SecurityToolsSummary.html)

* * *

**Note:** When a certificate is self signed, `UNKNOWN` will be displayed as the publisher of the application. For more information, see [Is it safe to run an application from a publisher that is listed as `UNKNOWN`?](http://www.java.com/en/download/faq/self_signed.xml).

* * *