转自:
常用的android的签名工具有两个即jarsigner 和apksigner。这两种使用的key格式不一样,keystore格式转pk8+x509.pem
1. 将keystore文件转换为pkcs12格式
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 是文本格式可以直接查看
打开文本:
Bag Attributes friendlyName: dtcamera localKeyID: 54 69 6D 65 20 31 34 35 38 38 31 37 33 31 30 37 30 36 Key Attributes:-----BEGIN PRIVATE KEY----- -----END PRIVATE KEY----- Bag Attributes friendlyName: dtcamera localKeyID: 54 69 6D 65 20 31 34 35 38 38 31 37 33 31 30 37 30 36 subject=/CN=DTC issuer=/CN=DTC -----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
打开文本可以看到私钥(PRIVATE KEY )和证书( CERTIFICATE);
复制“BEGIN CERTIFICATE” “END CERTIFICATE” 到(新建个文件) cert.x509.pem
复制 “BEGIN RSA PRIVATE KEY” “END RSA PRIVATE KEY” 到(同上) private.rsa.pemcert.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
jarsigner 的用法
jarsigner -verbose -keystore android.keystore -signedjar android_signed.apk android.apk android.keystore
使用这种方式会报错:找不到 的证书链。×× 必须引用包含专用密钥和相应的公共密钥证书链的有效密钥库密钥条目。
jarsigner -verbose -keystore DT.jks -signedjar signed.apk unsigned.apk "别名"
具体可参考 参考链接1
感谢橘小兔-一米阳光的文章,参考链接2,帮我解决了这个问题,亲测可行。参考链接