如何找出用于签署应用程序的密钥库?

Posted

技术标签:

【中文标题】如何找出用于签署应用程序的密钥库?【英文标题】:How do I find out which keystore was used to sign an app? 【发布时间】:2012-07-05 02:21:40 【问题描述】:

我有一个签名的应用程序和几个密钥库文件。我想更新应用程序,所以我需要找出使用了哪个键。

如何将最初用于签署我的应用程序的密钥库与我机器上的各种密钥库进行匹配?

【问题讨论】:

我不知道你能不能找到它,但如果你用错误的密钥签署应用程序,开发者控制台(你发布应用程序的地方)会告诉你它是错误的。您可以全部尝试。 有一个公钥“开发者控制台”>“编辑配置文件”。我可以用它来帮助自己吗? 不小心删除了keystore文件如何重新创建? @Maveňツ 你不能。如果你丢失了你的密钥库,你就完蛋了。 Google 确实引入了 [App Signing],他们保留了签名信息。 【应用签名】:support.google.com/googleplay/android-developer/answer/… 【参考方案1】:

首先,解压缩 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 安装目录。

【讨论】:

谢谢你。我在我的 github 项目中添加了一个执行此操作的工具。 github.com/RichardBronosky/ota-tools/blob/master/… 您好,我不懂这个命令~ keytool -list -keystore my-signing-key.keystore ,my-signing-key.keystore 是什么 @Thoman my-signing-key.keystore 是包含用于签署 apk 的密钥的密钥库文件的名称 非常感谢!我们的应用被 PlayStore 重新签名,导致谷歌登录失败。我必须直接从 PlayStore 下载 APK 并找到实际的 SHA1 才能在 Google Cloud 控制台中注册它。 Google 引入了two new APK signature schemes,两者都没有使用带有嵌入文件的传统 JAR 签名。 keytool 无法读取这些签名。请改用apksigner。【参考方案2】:

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 > Setup > App Integrity 页面上从 Google Play 控制台找到应用签名。

此过程记录在 Google 开发者网站上:https://developers.google.com/android/guides/client-auth

总结

如果 APK 和密钥库之间的 SHA1 指纹匹配,那么您可以放心,该应用已使用密钥签名。

【讨论】:

@goRGon 您使用的是 Java 7 或更高版本吗? @goRGon 事实上,-jarfile 参数是在 Java 7 中引入的。我已经更新了答案。 这应该是一个可以接受的答案。无需解压 @RichardBronosky 确实不是这样。我做了三年多的 Android 开发人员,没有做过 ios 开发。不过,出于不同的原因,我同意你的主要观点。 Java 1.6 似乎是迄今为止扩展最多的版本,或者至少是广泛使用的版本,虽然公认的解决方案适用于 1.6 和 1.7,但这个解决方案只能适用于 1.7,所以我认为这不应该是公认的答案(然而!)。 (另请注意,接受的答案是 2012 年表格,而这个答案来自 2014 年 4 月) 这也适用于 Android app bundle .aab 文件 :-)【参考方案3】:

以 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

【讨论】:

有趣!我在我们的私人托管分发商店的验证中使用了一种非常相似的方法,以通知用户该应用程序未正确签名。我还特别注意观察键别名是否为“androiddebugkey”以显示不同措辞的消息。我认为 Google Play 的验证方式大致相同。我想您正在使用它来验证 APKMirror 上的 APK? @PaulLammertsma 是的,我们是。【参考方案4】:

查看签名证书的方式更简单:

jarsigner.exe -verbose -verify -certs myapk.apk

这只会显示 DN,因此如果您有两个具有相同 DN 的证书,您可能需要通过指纹进行比较。

【讨论】:

什么是 DN?大多数情况下,我有很多这样的行:X.509, CN=firstname and lastname [certificate is valid from date from to date_to] DN 代表“专有名称”,在您的情况下,它是“CN=firstname and lastname”部分。【参考方案5】:

您可以使用作为 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 可以。【参考方案6】:

有许多免费软件可以检查证书和密钥存储,例如KeyStore Explorer。

解压apk并打开META-INF/?.RSA文件。 ?应该是 CERT 或 ANDROID 或者可能是其他东西。它将显示与您的 apk 相关的所有信息。

【讨论】:

以上是关于如何找出用于签署应用程序的密钥库?的主要内容,如果未能解决你的问题,请参考以下文章

未找到用于签署配置“发布”的密钥库。-- 反应原生

我想创建一个密钥库来签署应用程序,但每次我得到这个错误时说啥?

应用程序身份验证 - 从命令行提取公共签名密钥

密钥库文件未设置用于签署配置发布颤动(尝试发布模式时)

Android 签名密钥库

如何使用现有的 .cer、.p12 或 .pfx 证书签署应用程序?