SignJar

描述

对 JAR 文件进行签名可以让用户验证发布者。

使用 jarsigner 命令行工具对 JAR 文件进行签名。它将使用 jar 属性中指定的命名文件,以及可选的 destDirsignedJar 属性。也支持嵌套路径;这里只允许使用(可选的)destDir。如果没有提供目标目录或显式 JAR 文件名,则 JAR 文件将在原地进行签名。

依赖规则

参数

属性 描述 必需
jar 要签名的 JAR 文件 是,除非使用了嵌套路径
alias 要签名的别名
storepass 密钥库完整性的密码。Ant 不会使用 -storepass 命令行参数,而是在提示时将密码发送给 jarsigner。
keystore 密钥库位置
storetype 密钥库类型
keypass 私钥密码(如果不同)
sigfile .SF/.DSA 文件的名称
signedjar 已签名 JAR 文件的名称。只有在设置了 jar 属性时才能设置此属性。
verbose true|false)签名时的详细输出 否;默认值为 false
strict true|false)签名时的严格检查。
自 Ant 1.9.1 起.
否;默认值为 false
internalsf true|false)在签名块中包含 .SF 文件 否;默认值为 false
sectionsonly true|false)不计算整个清单的哈希值 否;默认值为 false
lazy 用于控制签名文件的存在是否意味着 JAR 文件已签名的标志。这仅在目标 JAR 文件与源 JAR 文件匹配时使用 否;默认值为 false
maxmemory 指定 jarsigner JVM 将使用的最大内存。以标准 Java 内存规范的风格指定(例如 128m = 128 兆字节)
preservelastmodified 使已签名文件具有与原始 JAR 文件相同的最后修改时间。 否;默认值为 false
tsaurl Java 5+ 中时间戳 JAR 文件的时间戳颁发机构的 URL
tsacert 密钥库中时间戳颁发机构的别名,用于 Java 5+ 中时间戳 JAR 文件
tsaproxyhost 连接到 TSA 服务器时要使用的代理主机
tsaproxyport 连接到 TSA 服务器时要使用的代理端口
executable 指定要使用的特定 jarsigner 可执行文件,以代替默认的二进制文件(位于与 Apache Ant 运行的相同 JDK 中)。
必须支持与 Sun JDK jarsigner 命令相同的命令行选项。自 Ant 1.8.0 起
force 是否强制对 JAR 文件进行签名,即使它似乎没有过期或已经签名。自 Ant 1.8.0 起 否;默认值为 false
sigalg 签名算法的名称
digestalg 摘要算法的名称
tsadigestalg TSA 摘要算法的名称。自 Ant 1.10.2 起
providername 在安全属性文件中列出时,加密服务提供程序的名称。自 Ant 1.10.6 起
providerclass 加密服务提供程序的主类文件名称,当服务提供程序未在安全属性文件中列出时。自 Ant 1.10.6 起
providerarg 表示 providerclass 的构造函数的可选字符串输入参数。如果未设置 providerclass,则忽略此参数。自 Ant 1.10.6 起

作为嵌套元素的参数

属性 描述 必需
path 要签名的 JAR 文件的路径。自 Ant 1.7 起
fileset 要签名的 JAR 文件的文件集。
mapper 用于在签名期间重命名 JAR 文件的映射器 否,并且只能提供一个
sysproperty JVM 系统属性,使用 Ant 环境变量 的语法 否,并且只能提供一个
arg 使用此参数指定未通过属性显式支持的 keytool 命令行参数自 Ant 1.10.6 起

示例

有关生成代码签名证书的说明,请参阅 keytool 文档 和/或证书颁发机构的说明。

使用别名 apache-groupant.jar 进行签名,并通过 secret 密码访问密钥库和私钥。

<signjar jar="${dist}/lib/ant.jar"
         alias="apache-group" storepass="secret"/>

对所有匹配 dist/**/*.jar 模式的 JAR 文件进行签名,并将它们复制到目录 signed 中。flatten 映射器意味着它们将全部复制到此目录,而不是复制到子目录中。

<signjar destDir="signed"
         alias="testonly" keystore="testkeystore"
         storepass="apacheant"
         preservelastmodified="true">
  <path>
    <fileset dir="dist" includes="**/*.jar"/>
  </path>
  <flattenmapper/>
</signjar>

dist/**/*.jar 中的所有 JAR 文件进行就地签名。使用延迟签名,因此只有在文件未签名时才会对其进行签名。

<signjar alias="testonly" keystore="testkeystore"
         storepass="apacheant"
         lazy="true">
  <path>
    <fileset dir="dist" includes="**/*.jar"/>
  </path>
</signjar>

使用摘要算法 SHA1 和签名算法 MD5withRSA 对 dist/**/*.jar 中的所有 JAR 文件进行签名。这在您想使用 JDK 7 jarsigner(使用 SHA256 和 SHA256withRSA 作为默认值)创建将在不支持 SHA256 和 SHA256withRSA 的平台上部署的已签名 JAR 文件时特别有用。

<signjar alias="testonly" keystore="testkeystore"
         storepass="apacheant"
         sigalg="MD5withRSA"
         digestalg="SHA1">
  <path>
    <fileset dir="dist" includes="**/*.jar"/>
  </path>
</signjar>

关于时间戳签名

时间戳记录签名发生的日期和时间,允许在该时间点验证签名。使用可信时间戳,用户可以验证签名是在证书过期或吊销之前发生的。如果没有此时间戳,用户只能验证其当前日期的签名。

时间戳 JAR 文件是在 Java 5 中引入的;自 Ant 1.7 起支持它们。自 Ant 1.9.5 起,可以使用未经身份验证的代理访问 TSA。

常见的公共时间戳颁发机构包括