Android签名jks转pkcs12(JKS密钥库使⽤专⽤格式。建议使⽤“keytool。。。
有遇到如下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
这⾏代码的意思是从之前创建的证书导⼊到新证书⾥,需要输⼊之前证书的相关⼝令 :
输⼊⽬标密钥库⼝令:即设置新证书的秘钥库密码
再次输⼊新⼝令:确认新密码android获取真正的签名
输⼊源密钥库⼝令:即之前创建的证书秘钥库密码
输⼊ 的密钥⼝令:之前秘钥库别名密码
输⼊正确后,会这样提⽰:
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 的⽤法
以上
再见

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。