签署 JAR 文件
原文: 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 文件
路径名之前。下表描述了可用的选项:
Jarsigner Command Options
| 选项 | 描述 |
| —- | —- |
| -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 签名和验证工具的完整参考页面在线:安全工具摘要
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
?.