有时候我们签名过的jar包因为某些原因更改过了,需要重新签名下,这个时候我们就需要删除原来的签名信息才能重新签名,不然会影响后面的签名。
1.删除原有签名信息
删除原有签名jar包META-INF文件夹下的三个文件,最好再把旧jar包改个名,后面会用到,这样我们生成的jar包的名字也就和我们原有的名字一样了。
2.使用java的keytool工具生成keystore文件
找到就旧jar包的目录下,按住shift,右键,然后选择“在此打开窗口命令”,执行签名命令
2.1.生成密钥库和带有别名的证书
keytool -genkey -keystore myKeyStore.ks -storepass myStor3pass -keypass myK3ypass -alias myCert -validity 3650
这个命令把密码和使用时间也写死了,年限是10年。执行命令后会要填写一些信息,填写完后输入y,表示完成。
2.2.查看密钥库的证书(可不执行)
keytool -list -v -alias myCert -keystore myKeyStore.ks -storepass myStor3pass
执行这个命令主要是为了查看我们刚刚填写的信息。
2.3.使用jarsinger给jar进行签名
jarsigner -keystore myKeyStore.ks -storepass myStor3pass -keypass myK3ypass -signedjar new.jar old.jar myCert
这里的old.jar使我们原来的jar包,new.jar使我们执行命令新生成的jar包,注意,两个名字不能一样。其中myCert指定了证书的名称。用winzip打开new.jar,会发现META-INF多出了MYCERT.SF(签名信息),MYCERT.DSA(证书)两个文件。
注:命令行不指定密钥库口令和证书的口令也可以,如:
jarsigner -verbose -keystore myKeyStore.ks -signedjar new.jar old.jar myCert
这样,系统会让你分别输入密钥库口令短语和myCert的密钥口令,输入正确后,会生成签名的jar。
2.4.使用jarsinger验证签名的jar
下面命令用来验证签名的jar是否没被篡改。
jarsigner -verify new.jar
返回结果:
jar 已验证。
说明jar验证成功。也可以打印验证的详细信息
jarsigner -verify -verbose eos-spring-signed.jar
2.5.注意
如果我们修改jar中一个文件,如com/primeton/spring/xsd/spring-util.xsd, 再次验证,会出现这个错误:
jarsigner: java.lang.SecurityException: SHA1 digest error for com/primeton/spring/xsd/spring-util.xsd
注意: 遗憾的是,直接使用jarsigner验证jar签名有一定的缺憾,jarsigner只能验证被修改过的jar内部class或其他文件,对于删除的class或文件是不报错的,对于增加的类或资源文件只报警告错误,如"此 jar 包含尚未进行完整性检查的未签名条目"。