我有一个签名的应用程序和几个密钥库文件。我想更新应用程序,所以我需要找出使用了哪个键。
如何将最初用于签署我的应用程序的密钥库与我机器上的各种密钥库进行匹配?
首先,解压APK并解压文件/META-INF/ANDROID_.RSA(这个文件也可能是CERT.RSA,但应该只有一个.RSA文件)。
然后发出这个命令:
keytool -printcert -file ANDROID_.RSA
你会得到这样的证书指纹:
MD5: B3:4F:BE:07:AA:78:24:DC:CA:92:36:FF:AE:8C:17:DB
SHA1: 16:59:E7:E3:0C:AA:7A:0D:F2:0D:05:20:12:A8:85:0B:32:C5:4F:68
Signature algorithm name: SHA1withRSA
然后再次使用 keytool 打印出签名密钥库的所有别名:
keytool -list -keystore my-signing-key.keystore
您将获得别名列表及其证书指纹:
android_key, Jan 23, 2010, PrivateKeyEntry,
Certificate fingerprint (MD5): B3:4F:BE:07:AA:78:24:DC:CA:92:36:FF:AE:8C:17:DB
瞧!我们现在可以确定该 apk 已使用此密钥库和别名“android_key”进行签名。
Keytool 是 Java 的一部分,因此请确保您的 PATH 中包含 Java 安装目录。
Gradle 签名报告
输出每个应用变体的签名信息的最简单方法是通过 using the Gradle Signing Report。
./gradlew signingReport
> Task :app:signingReport
Variant: debug
Config: debug
Store: ~/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A5:88:41:04:8D:06:71:6D:FE:33:76:87:AC:AD:19:23
SHA1: A7:89:E5:05:C8:17:A1:22:EA:90:6E:A6:EA:A3:D4:8B:3A:30:AB:18
SHA-256: 05:A2:2C:35:EE:F2:51:23:72:4D:72:67:A5:6C:8C:58:22:2A:00:D6:DB:F6:45:D5:C1:82:D2:80:A4:69:A8:FE
Valid until: Wednesday, August 10, 2044
APK 或 AAB 的签名
或者,您可以使用 Java 7 的密钥和证书管理工具 keytool
检查密钥库或 APK 的签名,而无需提取任何文件。
# APK file
keytool -printcert -jarfile app.apk
# AAB file
keytool -printcert -jarfile app.aab
输出将显示 APK 文件 app.apk
或 AAB 文件 app.aab
的签名所有者/颁发者和 MD5、SHA1 和 SHA256 指纹。
(请注意,-jarfile
参数是在 Java 7 中引入的;see the documentation 了解更多详细信息。)
密钥库的签名
同样,您可以检查用于签署应用程序的密钥库的签名。
keytool -list -v -keystore release.jks
输出将显示密钥库文件 release.jks
中的别名(条目)以及证书指纹(MD5、SHA1 和 SHA256)。
请注意,如果您使用 Play App Signing,您的上传密钥可能与 Google Play 用于签署您的应用程序的密钥不同。在这种情况下,您可以在 Release 上从 Google Play 管理中心找到应用签名 > 设置 > 应用完整性页面。
此过程记录在 Google 开发者网站上:
https://developers.google.com/android/guides/client-auth
综上所述
如果 APK 和密钥库之间的 SHA1 指纹匹配,那么您可以放心,该应用程序已使用密钥进行签名。
-jarfile
参数。我已经更新了答案。
为了建立 Paul Lammertsma 的答案,此命令将打印当前目录中所有 APK 的名称和签名(我正在使用 sh,因为稍后我需要将输出通过管道传输到 grep):
find . -name "*.apk" -exec echo "APK: {}" \; -exec sh -c 'keytool -printcert -jarfile "{}"' \;
样本输出:
APK: ./com.google.android.youtube-10.39.54-107954130-minAPI15.apk
Signer #1:
Signature:
Owner: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Issuer: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Serial number: 4934987e
Valid from: Mon Dec 01 18:07:58 PST 2008 until: Fri Apr 18 19:07:58 PDT 2036
Certificate fingerprints:
MD5: D0:46:FC:5D:1F:C3:CD:0E:57:C5:44:40:97:CD:54:49
SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
SHA256: 3D:7A:12:23:01:9A:A3:9D:9E:A0:E3:43:6A:B7:C0:89:6B:FB:4F:B6:79:F4:DE:5F:E7:C2:3F:32:6C:8F:99:4A
Signature algorithm name: MD5withRSA
Version: 1
APK: ./com.google.android.youtube_10.40.56-108056134_minAPI15_maxAPI22(armeabi-v7a)(480dpi).apk
Signer #1:
Signature:
Owner: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Issuer: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Serial number: 4934987e
Valid from: Mon Dec 01 18:07:58 PST 2008 until: Fri Apr 18 19:07:58 PDT 2036
Certificate fingerprints:
MD5: D0:46:FC:5D:1F:C3:CD:0E:57:C5:44:40:97:CD:54:49
SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
SHA256: 3D:7A:12:23:01:9A:A3:9D:9E:A0:E3:43:6A:B7:C0:89:6B:FB:4F:B6:79:F4:DE:5F:E7:C2:3F:32:6C:8F:99:4A
Signature algorithm name: MD5withRSA
Version: 1
或者,如果您只关心 SHA1:
find . -name "*.apk" -exec echo "APK: {}" \; -exec sh -c 'keytool -printcert -jarfile "{}" | grep SHA1' \;
样本输出:
APK: ./com.google.android.youtube-10.39.54-107954130-minAPI15.apk
SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
APK: ./com.google.android.youtube_10.40.56-108056134_minAPI15_maxAPI22(armeabi-v7a)(480dpi).apk
SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
查看签名证书的更简单方法:
jarsigner.exe -verbose -verify -certs myapk.apk
这只会显示 DN,因此如果您有两个具有相同 DN 的证书,您可能需要通过指纹进行比较。
您可以使用 Android SDK 中的 apksigner
工具执行此操作:
apksigner verify --print-certs my_app.apk
您可以在 build-tools 目录中找到 apksigner。例如:~/Library/Android/sdk/build-tools/29.0.1/apksigner
apksigner
不打印 split apk 的证书(那些以捆绑包形式分发的应用的 base.apk 随附的证书 (aab ); keytool
确实如此。
有许多免费软件可以检查证书和密钥存储,例如 KeyStore Explorer。
解压缩 apk 并打开 META-INF/?.RSA 文件。 ?应该是 CERT 或 ANDROID 或可能是其他东西。它将显示与您的 apk 相关的所有信息。
keytool
无法读取这些签名。请改用 apksigner。