详情可以参照:Jar 包签名 - Jack of Hearts - 博客园 (cnblogs.com)
1、使用keytool
创建密钥库:
案例1:
keytool -genkey -alias mykey -keystore mykeystore.jksmykey
是密钥别名,mykeystore.jks
是密钥库文件名。
案例2:建议跳转查看详情:Tomcat配置https方式访问-CSDN博客
PS C:\Users\namejr\Desktop\20240717> keytool -genkeypair -alias mykey -keyalg RSA -keystore C:\Users\namejr\Desktop\20240717\namejr.keystore -storetype pkcs12
-genkeypair:生成一对非对称密钥并将公钥包装到X.509 v3自签名证书中;同“-genkey”
-alias:指定密钥条目的别名,该别名是公开的;
-keyalg:指定加密算法,本例中的采用通用的RSA加密算法;
-keystore:指定密钥库的路径及名称,若密钥库不存在则创建。若不指定则默认在操作系统的用户目录下生成一个".keystore"的文件;
-validity 3650 (有效期,单位:天)
-storetype:指定密钥库的类型,如果不指定,默认是JKS。如果创建默认类型密钥库,命令行会提示转化为pkcs12类型,所以这里在创建时指定;
步骤二:生成上述store后,然后创建CSR:
keytool -certreq -keyalg RSA -alias mykey -file namejr.csr -keystore namejr.keystore
步骤三:从你获得证书的CA下载Chain Certificate(需要去ca网站获取获取证书)
步骤四:将Chain Certificate导入到keystore:
keytool -import -trustcacerts -alias root -file namejr.cer -keystore namejr.keystore
步骤五:最后,导入你的新证书:
keytool -import -trustcacerts -alias tomcat -file namejr.crt -keystore namejr.keystore
例子:控制面板输出内容:
PS C:\Users\namejr\Desktop\FXCollect1> keytool.exe -genkey -alias namejr -keystore namejr.jks 输入密钥库口令:namejr 再次输入新口令:namejr 您的名字与姓氏是什么? [Unknown]: XXX 您的组织单位名称是什么? [Unknown]: XXXXXXX 您的组织名称是什么? [Unknown]: XXXXXXXX 您所在的城市或区域名称是什么? [Unknown]: 广州 您所在的省/市/自治区名称是什么? [Unknown]: 广东省/广州市/白云区 该单位的双字母国家/地区代码是什么? [Unknown]: Ch/000000 CN=XXX, OU=XXXXXXX, O=XXXXXXXX, L=广州, ST=广东省/广州市/白云区, C=CH/0000是否正确? [否]: 是 输入 <namejr> 的密钥口令 (如果和密钥库口令相同, 按回车):namejr 再次输入新口令:namejr Warning: JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore namejr.jks -destkeystore namejr.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
查看密钥库信息:(详情同案例2)
PS C:\Users\namejr\Desktop\20240717> keytool -list -v -keystore C:\Users\namejr\Desktop\20240717\namejr.keystore 输入密钥库口令:namejr 密钥库类型: PKCS12 密钥库提供方: SUN 您的密钥库包含 1 个条目 别名: mykey 创建日期: 2024-7-17 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CN=XXX, OU=XXXXXX, O=XXXXX, L=广东省, ST=广州市, C=Ch/000000 发布者: CN=XXX, OU=XXXXXX, O=XXXXX, L=广东省, ST=广州市, C=Ch/000000 序列号: 6346965f 有效期为 Wed Jul 17 15:29:48 CST 2024 至 Tue Oct 15 15:29:48 CST 2024 证书指纹: MD5: 90:F9:C1:51:6E:3A:D6:1B:E6:85:9C:D0:0B:03:07:F7 SHA1: 33:80:0F:8E:EB:05:3C:82:70:73:4D:C1:AC:DF:9C:C1:EB:9D:C0:3B SHA256: 61:AF:F6:83:51:65:02:88:3E:45:15:28:E1:35:42:8E:DE:28:89:8D:AB:5D:98:C1:69:2C:B3:EE:24:90:A9:97 签名算法名称: SHA256withRSA 主体公共密钥算法: 2048 位 RSA 密钥 版本: 3 扩展: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 36 5B 1B 5D 52 5A A6 A4 A3 3B 46 59 2C B4 32 80 6[.]RZ...;FY,.2. 0010: 0B A0 9A 9C .... ] ] ******************************************* *******************************************
2、使用jarsigner
对jar包进行签名:
方式一: jarsigner -keystore mykeystore.jks myapp.jar mykey 这里myapp.jar是你要签名的jar包,mykeystore.jks是密钥库文件,mykey是密钥别名。 方式二: jarsigner -keystore mykeystore.ks -signedjar mynewapp.jar myapp.jar testkey 这里的mykeystore.jks是密钥库文件,mynewapp.jar未输出文件的名称,myapp.jar是你要签名的jar包,testkey 是密钥口令
例子:控制台输出:
PS C:\Users\namejr\Desktop\FXCollect1> jarsigner.exe -keystore .\namejr.jks -signedjar fxcollect.jar FX_Collect.jar namejr
输入密钥库的密码短语:namejr
jar 已签名。
警告:
签名者证书为自签名证书。
3、验证签名:
jarsigner -verify myapp.jar
注意,以上命令只是使用 Jar 包内的签名文件,验证 public key 与生成签名的 private key 是否是有效 key pair,以及 Jar 包内容是否完整,并没有和 keystore 进行比对。如果需要验证 Jar 包是否是使用某一 keystore 内的密钥进行的签名,可以指定如下的命令和选项:
jarsigner -verify -verbose -keystore mykeystore.ks myapp.jar
例子:控制台输出
PS C:\Users\namejr\Desktop\FXCollect1> jarsigner -verify fxcollect.jar jar 已验证。 警告: 此 jar 包含尚未进行完整性检查的未签名条目。 此 jar 包含其证书链无效的条目。原因: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 此 jar 包含其签名者证书为自签名证书的条目。 此 jar 包含签名者证书将在六个月内过期的条目。 此 jar 包含的签名没有时间戳。如果没有时间戳, 则在其中任一签名者证书到期 (最早为 2024-08-20) 之后, 用户可能无法验证此 jar。 有关详细信息, 请使用 -verbose 和 -certs 选项重新运行。
PS C:\Users\namejr\Desktop\FXCollect1> jarsigner -verify -verbose -keystore .\namejr.jks .\fxcollect.jar s k 12280 Wed May 22 15:18:48 CST 2024 META-INF/MANIFEST.MF 11179 Wed May 22 15:18:48 CST 2024 META-INF/NAMEJR.SF 1579 Wed May 22 15:18:48 CST 2024 META-INF/NAMEJR.DSA 0 Mon Apr 08 15:22:44 CST 2024 META-INF/ 0 Mon Apr 08 15:22:44 CST 2024 CSS/ ... 0 Mon Apr 08 15:22:46 CST 2024 com/lancoo/service/ smk 4537 Mon Apr 08 15:22:44 CST 2024 CSS/index.css ... smk 3765 Mon Apr 08 15:22:46 CST 2024 com/lancoo/service/LGBasicService.class smk 4187 Mon Apr 08 15:22:46 CST 2024 index.html m 2812 Mon Apr 08 15:22:46 CST 2024 classes/PlugIn/tipsDialog_typeF1/image/图标(中)---操作提示.png s = 已验证签名 m = 在清单中列出条目 k = 在密钥库中至少找到了一个证书 i = 在身份作用域内至少找到了一个证书 - 由 "CN=XXX, OU=XXXXXXX, O=XXXXXXXX, L=广州, ST=广东省/广州市/白云区, C=CH/0000" 签名
摘要算法: SHA-256 签名算法: SHA256withDSA, 2048 位密钥 jar 已验证。 警告: 此 jar 包含尚未进行完整性检查的未签名条目。 有关详细信息, 请使用 -verbose 和 -certs 选项重新运行。
注:关于“此 jar 包含的签名没有时间戳。如果没有时间戳, 则在其中任一签名者证书到期 (最早为 2024-08-20) 之后, 用户可能无法验证此 jar。” ,可以查看警告: 未提供 -tsa 或 -tsacert, 此 jar 没有时间戳。如果没有时间戳, 则在签名者证书的到期_apj没有时间戳-CSDN博客(未实践,仅作笔记记录)
2.以上方法可以解决签名后不能安装成功的问题,但是会发现有警告: 警告: 未提供 -tsa 或 -tsacert, 此 jar 没有时间戳。如果没有时间戳, 则在签名者证书的到期 日期 (2063-07-18) 或以后的任何撤销日期之后, 用户可能无法验证此 jar。 入有这个警告的话本身对签名没有影响,但是总感觉怪怪的,要想去掉这个警告只要在命令上再加上 -tsa https://timestamp.geotrust.com/tsa 就可以了 最终命令是: jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa https://timestamp.geotrust.com/tsa -keystore test.keystore -storepass test123 -signedjar signed_client.apk client.apk test