Jar文件签名与签名验证

1. 生成签名

keytool -genkey -v -keystore cert.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myalias

执行完命令后如下
输入密钥库口令: 输入密码
再次输入新口令: 输入密码
输入唯一判别名。提供单个点 (.) 以将子组件留空,或按 ENTER 以使用大括号中的默认值。
您的名字与姓氏是什么?
[Unknown]: 测试单位
您的组织单位名称是什么?
[Unknown]: 测试单位
您的组织名称是什么?
[Unknown]: 测试单位
您所在的城市或区域名称是什么?
[Unknown]: 北京市
您所在的省/市/自治区名称是什么?
[Unknown]: 北京市
该单位的双字母国家/地区代码是什么?
[Unknown]: 中国
CN=测试单位, OU=测试单位, O=测试单位, L=北京市, ST=北京市, C=中国是否正确?
[否]: 是

正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA384withRSA) (有效期为 10,000 天):
CN=测试单位, OU=测试单位, O=测试单位, L=北京市, ST=北京市, C=中国
[正在存储cert.jks]

2. 标记文件hash以防文件被篡改

//对jar文件进行SM3加密拿到文件hash

SmUtil.sm3(jarFile)

pom依赖

 <dependency>
     <groupId>cn.hutool</groupId>
     <artifactId>hutool-all</artifactId>
     <version>5.7.4</version>
 </dependency>

记录文件hash

3. Jar签名

jarsigner -keystore cert.jks -storepass 88484118 -keypass 88484118 test.jar myalias 

执行后如下

jar 已签名。

警告:
签名者证书为自签名证书。
检测到 POSIX 文件权限和/或 symlink 属性。这些属性在进行签名时会被忽略,不受该签名的保护。
已经签名的jar文件需要通过java命令来查验,签名会对包内所有内容进行签名

4. 签名查验

注:这里需要自行对比序列号,jarsigner命令不会根据证书查验是否跟jar中证书致

jarsigner -verify -verbose -certs test.jar

执行完如下

s 55988 Tue Jun 18 14:58:40 CST 2024 META-INF/MANIFEST.MF
>>> 签名者
X.509, CN=测试单位, OU=测试单位, O=测试单位, L=北京市, ST=北京市, C=中国
Signature algorithm: SHA384withRSA, 2048 位密钥
[证书的有效期为2024/6/18 14:55至2051/11/4 14:55]
[无效的证书链: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]
55912 Tue Jun 18 14:58:40 CST 2024 META-INF/MYALIAS.SF
1636 Tue Jun 18 14:58:40 CST 2024 META-INF/MYALIAS.RSA
0 Fri May 17 16:06:52 CST 2024 META-INF/
0 Fri May 17 16:06:52 CST 2024 org/
0 Fri May 17 16:06:52 CST 2024 org/springframework/
0 Fri May 17 16:06:52 CST 2024 org/springframework/boot/
0 Fri May 17 16:06:52 CST 2024 org/springframework/boot/loader/
0 Fri May 17 16:06:52 CST 2024 org/springframework/boot/loader/data/
0 Fri May 17 16:06:52 CST 2024 org/springframework/boot/loader/archive/
0 Fri May 17 16:06:52 CST 2024 org/springframework/boot/loader/jar/
0 Fri May 17 16:06:52 CST 2024 org/springframework/boot/loader/util/
0 Fri May 17 16:06:52 CST 2024 BOOT-INF/
0 Fri May 17 16:06:52 CST 2024 BOOT-INF/classes/
0 Fri May 17 16:06:50 CST 2024 BOOT-INF/classes/com/
0 Fri May 17 16:06:50 CST 2024 BOOT-INF/classes/log/
0 Fri May 17 16:06:54 CST 2024 META-INF/maven/
0 Fri May 17 16:06:52 CST 2024 BOOT-INF/lib/
sm 1585 Thu Mar 26 11:30:08 CST 2020 org/springframework/boot/loader/JarLauncher.class
>>> 签名者
X.509, CN=测试单位, OU=测试单位, O=测试单位 L=北京市, ST=北京市, C=中国
Signature algorithm: SHA384withRSA, 2048 位密钥
[证书的有效期为2024/6/18 14:55至2051/11/4 14:55]
[无效的证书链: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

sm 4015 Thu Mar 26 11:30:08 CST 2020 org/springframework/boot/loader/data/RandomAccessDataFile.class
>>> 签名者
X.509, CN=测试单位, OU=测试单位, O=测试单位, L=北京市, ST=北京市, C=中国
Signature algorithm: SHA384withRSA, 2048 位密钥
[证书的有效期为2024/6/18 14:55至2051/11/4 14:55]
[无效的证书链: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

5. 比对签名密钥是否一致

优先对比jar文件是否被篡改

5.1. 对比jar文件hash是否一致

//对jar文件进行SM3加密拿到文件hash

SmUtil.sm3(jarFile).equals(SmUtil.sm3(checkFile))

对比证书指纹是否相同

5.2. 对比证书指纹

keytool --printcert -jarfile test.jar 

签名者 #1:

证书 #1:
所有者: CN=测试单位, OU=测试单位, O=测试单位, L=北京市, ST=北京市, C=中国
发布者: CN=测试单位, OU=测试单位, O=测试单位, L=北京市, ST=北京市, C=中国
序列号: 6d934f6cfcea1ccf
生效时间: Tue Jun 18 14:55:35 CST 2024, 失效时间: Sat Nov 04 14:55:35 CST 2051
证书指纹:
SHA1: 08:4F:F9:E2:CF:89:38:45:7A:3A:00:CE:B7:2E:8B:43:F0:95:19:E4
SHA256: 42:07:AD:1B:36:F3:E0:1F:85:8A:21:F1:9F:3C:60:2E:FC:72:28:10:18:08:34:7D:48:CC:D0:FF:5A:4C:51:DF
签名算法名称: SHA384withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 38 9A 4E 92 91 B9 5E FC D0 BC 13 C9 77 09 B6 B8 8.N…^…w…
0010: A9 EE D0 F6 …
]
]
查看自己的密钥信息
keytool -list -v -keystore cert.jks
输入密钥库口令:
密钥库类型: PKCS12
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: myalias
创建日期: 2024年6月18日
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=测试单位, OU=测试单位, O=测试单位, L=北京市, ST=北京市, C=中国
发布者: CN=测试单位, OU=测试单位, O=测试单位, L=北京市, ST=北京市, C=中国
序列号: 6d934f6cfcea1ccf
生效时间: Tue Jun 18 14:55:35 CST 2024, 失效时间: Sat Nov 04 14:55:35 CST 2051
证书指纹:
SHA1: 08:4F:F9:E2:CF:89:38:45:7A:3A:00:CE:B7:2E:8B:43:F0:95:19:E4
SHA256: 42:07:AD:1B:36:F3:E0:1F:85:8A:21:F1:9F:3C:60:2E:FC:72:28:10:18:08:34:7D:48:CC:D0:FF:5A:4C:51:DF
签名算法名称: SHA384withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 38 9A 4E 92 91 B9 5E FC D0 BC 13 C9 77 09 B6 B8 8.N…^…w…
0010: A9 EE D0 F6 …
]
]
对比序列号即可

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值