当我们需要修改已经打包好的apk中的某个文件时,比如改下图标,我们势必要采用反编译apk,改文件,重编译apk,重签名才行,参考:https://www.cnblogs.com/zndxall/p/9628475.html
但是如果我们不需要改apk里的东西呢,只是想重新签名一下,比如我们会有这样的场景需要验证,apk只能是我们自己的签名才能安装,如果其他人换用其他签名就会安装失败并报错签名不可用。这个时候我们只需要重新签名apk就可以了,如果还是采用反编译,删META-INF,重编译,再签名,一个apk,我们可以忍受,多个apk呢,就有点吃力了。这个时候,我们可以采用另一种方式签名:就是把key转化成pk8和pem文件,然后一条命令就可以完成重签名了
过程如下:
1.keystore文件转化为pk8+pem
keytool -importkeystore -srckeystore my.keystore -destkeystore tmp.p12 -srcstoretype JKS -deststoretype PKCS12
2. 将PKCS12 dump成pem
openssl pkcs12 -in tmp.p12 -nodes -out tmp.rsa.pem
tmp.rsa.pem 是文本格式可以直接查看。
打开文本可以看到私钥(PRIVATE KEY )和证书(CERTIFICATE);
复制“BEGIN CERTIFICATE” “END CERTIFICATE” 到(新建个文件) cert.x509.pem
复制 “BEGIN RSA PRIVATE KEY” “END RSA PRIVATE KEY” 到(同上) private.rsa.pem
cert.x509.pem 文件即是我们最后需要的证书文件
3.生成pk8格式的私钥
openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt
cert.x509.pem private.pk8
即是我们最后需要的文件。
*备注:
-nocrypt 这个参数设定key加密 如果设置了这个参数 下面签名 只要证书+key 不需要密码了 如果加密 应该
openssl pkcs8 -topk8 -outform
DER -in private.rsa.pem -inform PEM -out private.pk8 接下来输入密码*
4.用法
java -jar signapk.jar cert.x509.pem private.pk8 unsigned.apk signed.apk