1. 查看签名
提取签名
jar xf HelloWorld.apk META-INF/CERT.RSA
打印签名
keytool -printcert -file CERT.RSA
打印公钥,签名用的公钥
keytool -printcert -file CERT.RSA -rfc
,或者导出到一个文件keytool -printcert -file CERT.RSA -rfc > my_pub.key
相同的签名的不同版本APK应用相同的md5,sha1,sha256指纹,代表同一个公钥签名。
2. 查看public key的指纹
指纹就是用散列算法计算公钥的文本,rfc格式(带有
-----BEGIN CERTIFICATE-----
和-----END CERTIFICATE-----
)。
使用上面步骤得到的my_pub.key,验证md5。实际工作中不需要,工具都帮我们做好了。
1 | openssl x509 -noout -fingerprint -md5 -inform pem -in my_pub.key |
3. 查看keystore中的签名
keystore中有多个公钥秘钥对,一个对就是一个alias, 每个的访问密码不同。
keytool -list -keystore my.keystore -alias myAlias
输入库密码可以看到公钥的指纹。
4. 给apk签名
jarsigner -verbose -keystore my.keystore -signedjar ma_app_signed.apk my.apk myAlias
5. Android Studio Debug签名
默认Android Stuido Debug时会自动签名(这个是IDE生成的,gradle命令行不会自动生成签名),用的keystore是没有密码的,但是有时候我们调试第三方登录,需要固定的签名,所以就自己生成签名,覆盖默认的Debug的签名。
5.1 生成Debug签名
$ keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname "C=US, O=Android, CN=Android Debug"
https://gist.github.com/henriquemenezes/70feb8fff20a19a65346e48786bedb8f
这里需要注意的是,如果用的JDK8里面的keytool生成的keystore是没有问题的。但是用JDK11里面的keytll生成keystore会报错:Invalid keystore forma。两种方案:
- 用回JDK8的keytool生成keystore
- 用Android Studio生成keystore