使用jarsigner签名JAR文件

Jarsigner是Java Development Kit (JDK)提供的针对Java Archive (JAR) 包签名的通用工具,并校验已签名的JAR文件的签名和完整。通过阅读此文,你将会了解如何使用jarsigner签署JAR文件。

前提条件

  • JDK 1.7及以上版本
  • 已获取代码签名证书。有关获取数字证书方法,可参阅如何获取数字证书

如何签名JAR文件

假设有一个JAR文件名为bundle.jar,你希望对密钥库中用户的私钥进行签名。则运行下列命令:

jarsigner -keystore <jks密钥文件> -storepass <秘钥库密码> keypass <私钥密码> <密钥对别名> -tsa <时间戳>

注意:在有网络的Windows环境下,当d:\\1文件夹下有1.jks (密码是123123)和1.jar文件,则时间戳(TSA)是可选的。其命令为:

D:  (切换至d)
Cd 1  (进入1文件夹)
Jarsigner  –keystore  1.jks –storepass 123123  1.jar  mykey  –tsa
http://sha256timestamp.ws.symantec.com/sha256/ 

如何校验已签名JAR文件

要校验已签名的JAR文件(bundle.jar)的签名合法性以及是否未被更改过,运行如下命令:

jarsigner -verify bundle.jar
jar verified.  #表明校验成功。否则将出现错误信息。

注意:你可使用jarsigner -verify -verbose bundle.jar命令获得更多的信息。
其输出为:

198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF
199 Fri Sep 26 16:22:10 PDT 1997 META-INF/name.SF
1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/name.DSA
smk   2752 Fri Sep 26 16:12:30 PDT 1997 AclEx.class
smk    849 Fri Sep 26 16:12:46 PDT 1997 test.class
s = signature was verified
m = entry is listed in manifest
k = at least one certificate was found in keystore
jar verified.

如何校验代码签名证书信息

添加-certs参数即可,即运行如下命令行:

jarsigner -keystore <jks密钥文件> -verify -verbose -certs bundle.jar

其输出结果包括该JAR文件(bundle.jar)的每个签名人的证书信息,大致上如下所示:

  198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF
  199 Fri Sep 26 16:22:10 PDT 1997 META-INF/name.SF
  1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/name.DSA
  208 Fri Sep 26 16:23:30 PDT 1997 META-INF/JAVATEST.SF
  1087 Fri Sep 26 16:23:30 PDT 1997 META-INF/JAVATEST.DSA
  smk   2752 Fri Sep 26 16:12:30 PDT 1997 Tst.class
  
  X.509, CN=Test Group, OU=Java Software, O=Sun Microsystems, L=CUP, S=CA, C=US (javatest)  #表明签名人的特征名信息(需签名人的证书是X.509证书)。
  X.509, CN=name, OU=Java Software, O=Sun, L=cup, S=ca, C=us (name) 
  #(name)表明签名人在密钥库中别名(需JAR文件中的公钥证书与密钥仓库项中的证书匹配)。
  
  s = signature was verified
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
 jar verified.

更多信息

在使用jarsigner工具签名JAR文件中遇到问题,可致电021-58895880-606与我们联系。