一、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软件包的过程分为以下三个步骤:
- 生成数字证书,并将其存储在keystore中;
- 对Java软件包进行数字签名;
- 使用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应用程序的安全性和可靠性。