我有一个签名的应用程序和几个keystore文件。我想更新应用程序,所以我需要找出哪个钥匙被使用了。
如何将最初用于为应用程序签名的密钥存储库与机器上的各种密钥存储库相匹配?
首先,解压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安装目录。
查看签名证书的更简单方法:
jarsigner.exe -verbose -verify -certs myapk.apk
这将只显示DN,因此如果您有两个具有相同DN的cert,则可能必须通过指纹进行比较。
输出应用程序每个变体的签名信息最简单的方法是通过使用Gradle签名报告。
./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
或者,您可以使用Java 7的密钥和证书管理工具keytool来检查密钥库或APK的签名,而不提取任何文件。
keytool
# APK file keytool -printcert -jarfile app.apk # AAB file keytool -printcert -jarfile app.aab
输出将显示APK文件app.apk或AAB文件app.aab的签名所有者/颁发者和MD5、SHA1和SHA256指纹。
app.apk
app.aab
(注意,-jarfile参数是在Java 7中引入的;参见文档获取更多详细信息。)
-jarfile
同样,您可以检查用于为应用程序签名的密钥存储库的签名。
keytool -list -v -keystore release.jks
输出将显示密钥库文件release.jks中的别名(条目),以及证书指纹(MD5、SHA1和SHA256)。
release.jks
请注意,如果您正在使用播放应用签名,您的上传密钥可能与谷歌Play用于签名应用程序的密钥不同。在这种情况下,您可以从谷歌Play控制台的释放 >设置祝辞应用程序完整性页面。
该过程在谷歌开发人员网站上有文档: https://developers.google.com/android/guides/client-auth < / p >
如果APK和密钥存储库之间的SHA1指纹匹配,那么您就可以放心,应用程序是用这个密钥签名的。
根据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
有许多免费软件可以检查证书和密钥存储库,例如密钥存储库浏览器。
解压apk并打开META-INF/?RSA文件。? 应该是CERT或ANDROID或其他东西。它将显示与apk相关的所有信息。
你可以使用Android SDK的一部分apksigner工具来做到这一点:
apksigner
apksigner verify --print-certs my_app.apk
~/Library/Android/sdk/build-tools/29.0.1/apksigner