Android签名jks转pkcs12(JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore xx pkcs12“ 迁移到行业标准格式 PKCS12)

有遇到如下error的朋友,可以阅读此文解决:
1、JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore E:\eeee -destkeystore E:\eeee -deststoretype pkcs12” 迁移到行业标准格式 PKCS12。
2、目标 pkcs12 密钥库具有不同的 storepass 和 keypass。请在指定了 -destkeypass 时重试。
3、PKCS12 密钥库不支持其他存储和密钥口令。正在忽略用户指定的-destkeypass值。
先说一下背景,换新公司后项目需要重新创建签名文件,所以遇到了这个之前没有遇到过的问题,既然提示这个警告了(其实用jks类型的一样能打包签名),那我还是来解决一下(强迫症好难)。我很好奇为什么AS(包括用命令指定签名类型)不能直接给我们生成pkcs12类型的签名文件,目前猜测可能是keytool版本问题,这里不深究。讲一下我的解决思路:
1、是否能直接生成pkcs12类型的证书
2、怎么把jks证书转换成pkcs12的

首先说方案一,很简单,用命令生成证书的时候指定storetype为pkcs12:

keytool -genkey -v -alias xxx -keyalg RSA -storetype PKCS12 -keystore E:\xxx -storepass yourStorePass -keypass yourAliasPass -validity 36500

后续按照提示生成即可。(由于公司原因,不便截图,见谅,有遇到问题的话下方评论)
此时生成的证书确实是pkcs12,但alias的口令(密码)与密钥库的口令一样(至于为什么一样,可能还是keytool的版本问题,不深究),如果这样能满足你的需求,那就不用往下看了。但一般我们不希望别名和秘钥库的口令是一样的,所以接下来我们用命令修改刚才创建的别名口令即可:

keytool -keypasswd -alias xxx -keystore C:\xxxxx

到此问题解决。

方案二:使用AS或者普通命令创建证书后,会有如下的提示:
JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore C:\xxx -destkeystore C:\xxx -deststoretype pkcs12” 迁移到行业标准格式 PKCS12。

附普通创建命令:

keytool -genkey -alias test -keypass 654321 -keyalg RSA -keysize 2048 -validity 36500 -keystore C:\xxx -storepass 123456

接着运行其建议的命令:

keytool -importkeystore -srckeystore C:\xxx -destkeystore C:\xxx -deststoretype pkcs12

这行代码的意思是从之前创建的证书导入到新证书里,需要输入之前证书的相关口令 :
输入目标密钥库口令:即设置新证书的秘钥库密码
再次输入新口令:确认新密码
输入源密钥库口令:即之前创建的证书秘钥库密码
输入 的密钥口令:之前秘钥库别名密码
输入正确后,会这样提示:
keytool 错误: java.lang.Exception: 目标 pkcs12 密钥库具有不同的 storepass 和 keypass。请在指定了 -destkeypass 时重试。

好,我们继续按照他的要求添加目标别名pass:

keytool -importkeystore -srckeystore C:\xxx -destkeystore C:\xxx -deststoretype pkcs12 -destkeypass 654321

输入源秘钥库口令后,得到如下提示:
警告: PKCS12 密钥库不支持其他存储和密钥口令。正在忽略用户指定的-destkeypass值。
查看证书内容可知密钥库类型已经是 PKCS12:

keytool -list -v -keystore C:\xxx

也就是说这个keytool不让我们的库秘钥和别名秘钥不一致,先不管警告。这里有两种方案:
a、修改alias test的密码:

keytool -keypasswd -alias test -keystore C:\xxx

b、用上面转换后的证书继续创建一个名为test1的alias,这个alias也即我们需要的alias,之后再删除test别名(因为它的口令跟秘钥库的口令一样):

keytool -genkey -alias test1 -keypass 654321 -keyalg RSA -keysize 2048 -validity 36500 -keystore C:\xxx -storepass 123456

执行后,查看证书的别名,已经有两个了:

keytool -list -v -keystore C:\xxx

删除test别名:

keytool -keystore C:\xxx -delete -alias test

再查看内容,别名只剩我们需要的test1。
到此问题解决。

由此可见,方案一是正解,最简单快捷,不过方案二可以熟悉更多的命令。

这里顺便总结一些常用keytool命令:
1、创建普通证书:
keytool -genkey -alias test -keypass 654321 -keyalg RSA -keysize 2048 -validity 36500 -keystore C:\xxx -storepass 123456

2、创建pkcs12证书:
keytool -genkey -v -alias test -keyalg RSA -storetype PKCS12 -keystore C:\xxx -storepass yourStorePass -keypass yourAliasPass -validity 36500

3、在已有证书里增加alias:
keytool -genkey -alias test1 -keypass 654321 -keyalg RSA -keysize 2048 -validity 36500 -keystore C:\xxx -storepass 123456

4、删除证书里的alias:
keytool -keystore C:\xxx -delete -alias test

5、修改alias密码:
keytool -keypasswd -alias test -keystore C:\xxx

6、查看 keystore信息:
keytool -list -v -keystore debug.keystore

7、空包签名:
jarsigner -verbose -keystore [keystorePath] -signedjar [apkOut] [apkIn] [alias]

8、打开待查看的apk,将其中META-INF文件夹解压出来,得到其中的CERT.RSA文件
keytool -printcert -file META-INF/CERT.RSA

更多命令可cmd 输入keytool查看:
-certreq 生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令

使用 “keytool -command_name -help” 获取 command_name 的用法

以上
再见

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值