1. keytool命令获取APK签名的原理
1.1 APK的签名本质
- Android APK 本质上是一个 zip 压缩包,里面包含了应用的所有资源和代码。
- 在 APK 打包时,开发者会用 keystore(私钥)对 APK 进行数字签名。
- 签名信息会被写入 APK 的
META-INF
目录下(如META-INF/CERT.RSA
、META-INF/CERT.DSA
等文件)。 - 这些文件中包含了签名证书(公钥)和签名摘要。
1.2 keytool 的作用
keytool
是 Java 自带的密钥和证书管理工具,可以用来查看证书的详细信息,包括 SHA1、SHA256 等指纹。- 这些指纹是证书的唯一标识,常用于三方平台(如微信、支付宝、推送等)校验 App 身份。
1.3 获取签名指纹的流程
- APK签名时
- 用 keystore(私钥)对 APK 进行签名,生成证书(公钥)并写入到 APK 的
META-INF
目录下。
- 用 keystore(私钥)对 APK 进行签名,生成证书(公钥)并写入到 APK 的
- 提取证书
- 用
keytool
或jarsigner
等工具可以从 APK 的META-INF/CERT.RSA
文件中提取出证书。
- 用
- 计算指纹
keytool
读取证书内容,对证书的公钥信息做哈希(如 SHA1、SHA256),生成唯一的指纹字符串。
2. 实际命令与用法
2.1 查看 keystore 的 SHA1/SHA256
keytool -list -v -keystore your.keystore
- 这会显示 keystore 里所有证书的 SHA1、SHA256 指纹。
2.2 查看 APK 的签名证书指纹
keytool -printcert -jarfile your.apk
- 这会自动从 APK 的
META-INF
目录下找到证书文件,解析并输出 SHA1、SHA256 指纹。
输出示例:
Owner: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xx
Issuer: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xx
Serial number: xxxxx
SHA1: 11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44
SHA256: 112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00
3. 原理总结
- 签名证书是 APK 身份的唯一凭证,SHA1/SHA256 是证书的哈希摘要。
- keytool 通过读取 APK 内的证书文件,计算其哈希值,输出 SHA1/SHA256 指纹。
- 三方平台通过比对你注册的 SHA1/SHA256 指纹和 APK 实际签名证书的指纹,来校验 App 身份。
4. 补充说明
- SHA1/SHA256 指纹不会因包名、代码变化而变化,只与签名证书相关。
- 更换 keystore(签名证书)会导致 SHA1/SHA256 指纹变化,三方平台校验会失败。
- debug 和 release 签名的 SHA1/SHA256 不同,注意区分。
如需更详细的命令用法、证书结构解析、或遇到签名校验失败的排查方法,欢迎继续提问!