笔记

万物寻其根,通其堵,便能解其困。
  博客园  :: 新随笔  :: 管理

jar包签名处理笔记

Posted on 2024-05-22 14:44  草妖  阅读(12)  评论(0)    收藏  举报

详情可以参照:Jar 包签名 - Jack of Hearts - 博客园 (cnblogs.com)

1、使用keytool创建密钥库:

案例1:
keytool -genkey -alias mykey -keystore mykeystore.jks
mykey是密钥别名,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