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 …
]
]
对比序列号即可