您的位置:

jarsigner介绍与用法详解

一、jarsigner概述

jarsigner是Java Development Kit自带的命令行工具,用于对JAR、WAR、EAR等Java软件包进行数字签名,并可以验证这些签名的有效性。数字签名是保证Java软件包不被篡改的一种方式,验证签名的有效性是保证软件包的完整性和安全性。

jarsigner对于Java软件包的数字签名和验证非常重要。下面将深入介绍其具体功能和用法。

二、jarsigner基本命令

jarsigner可使用以下命令:

jarsigner [options] jar-file alias
jarsigner -verify [options] jar-file

其中:

  • jar-file:需要签名或验证签名的Java软件包,可以是JAR、WAR、EAR等类型的文件;
  • alias:用于签名的数字证书名称,如果使用了keystore,也可以是在其中存储的证书别名。

下面是一些常用的选项:

  • -keystore:指定数字证书存储位置,不指定则使用默认的证书存储文件。可以使用“-storepass”选项设置密码;
  • -tsa:指定时间戳机构URL,用于证明签名是在某个特定的时间之前完成的;
  • -verbose:翻译签名操作的详细输出。

三、数字证书和keystore

jarsigner使用数字证书对Java软件包进行签名,签名证书使用X.509格式,可使用Java keytool命令从数字证书颁发机构(如CA)处获得。数字证书包含一个公钥和一个私钥,私钥是签名Java软件包时使用的。

数字证书需要存储在keystore中,keystore是一个包含数字证书的文件(通常是.jks或.p12格式),需要用密码进行保护。可以使用Java keytool命令创建和管理keystore。

使用jarsigner进行签名时,可以指定keystore的位置和密码:

jarsigner -keystore myKeystore jar-file myCertificate 

四、如何签名Java软件包

签名Java软件包的过程分为以下三个步骤:

  1. 生成数字证书,并将其存储在keystore中;
  2. 对Java软件包进行数字签名;
  3. 使用jarsigner验证签名的有效性。

1. 生成数字证书

可以使用Java keytool命令生成数字证书,并将证书存储在keystore中。以下命令可生成一个包含一个自签名数字证书的keystore:

keytool -genkey -alias myAlias -keyalg RSA -keysize 2048 -validity 1800 -keystore myKeystore

其中:

  • alias:数字证书的别名;
  • keyalg:密钥算法,这里使用RSA;
  • keysize:密钥长度,这里设置为2048位;
  • validity:证书有效期,这里设置为30天;
  • keystore:keystore文件的名称,默认为.jks格式。

2. 对Java软件包进行数字签名

使用以下命令对Java软件包进行数字签名:

jarsigner -keystore myKeystore myApp.jar myAlias

其中:

  • myApp.jar:需要签名的Java软件包;
  • myAlias:数字证书的别名。

3. 验证签名的有效性

可以使用以下命令验证签名的有效性:

jarsigner -verify -verbose myApp.jar

如果签名有效,则应该看到以下输出:

jar verified.
Warning: 
This jar contains entries whose signer certificate will expire within six months.
Re-run with the -verbose and -certs options for more details.

五、jarsigner常用选项

jarsigner有许多其他选项,下面是一些常用的选项。

1. -storepass

使用以下命令指定keystore密码:

jarsigner -keystore myKeystore -storepass myPassword myApp.jar myAlias

2. -tsa

使用以下命令指定时间戳机构URL:

jarsigner -tsa http://timestamp.digicert.com myApp.jar myAlias

3. -verbose

使用以下命令翻译签名操作的详细输出:

jarsigner -verbose myApp.jar myAlias

六、jarsigner异常处理

jarsigner可能会抛出以下异常:

1. 未找到keystore

jarsigner: unable to open jar file: myApp.jar

发生此异常的原因是没有找到keystore。可以使用以下命令指定keystore的位置:

jarsigner -keystore myKeystore myApp.jar myAlias

2. keystore密码不匹配

jarsigner: keystores/MyKeyStore not found

发生此异常的原因是密码错误。可以使用以下命令指定正确的密码:

jarsigner -keystore myKeystore -storepass myPassword myApp.jar myAlias

3. 证书过期

jarsigner: Certificate chain not found for myAlias.  myAlias must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain.

发生此异常的原因是数字证书已过期。可以使用新的数字证书进行签名。

七、结论

jarsigner是一个非常有用的Java工具,可以方便地对Java软件包进行数字签名,并且可以验证签名的有效性。使用jarsigner可以提高Java应用程序的安全性和可靠性。