我如何找出使用哪个密钥库对应用程序进行签名?


260

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

如何与机器上拥有的各种密钥库匹配用于最初对应用程序进行签名的密钥库?


我不知道您能否找到它,但是如果您使用错误的密钥对应用程序进行签名,则开发人员控制台(您在其中发布应用程序)会告诉您这是错误的。您可以全部尝试。
logcat 2012年

有一个公共密钥“开发人员控制台”>“编辑配置文件”。我可以用它来帮助自己吗?
xliiv 2012年

如果密钥库文件被意外删除,如何重新创建?
行家ツ

@Maveňツ,你不能。如果您丢失密钥库,那么您就敬酒了。Google确实引入了[App Signing],它们保留了签名信息。[应用签名]:support.google.com/googleplay/android-developer/answer/…–
mir,

Answers:


401

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


1
这次真是万分感谢。我在github项目中添加了执行此操作的工具。github.com/RichardBronosky/ota-tools/blob/master/...
布鲁诺Bronosky

您好我不明白这个命令〜密钥工具-list -keystore我的签名,key.keystore,什么是我的签名,key.keystore
托曼

2
@Thoman my-signing-key.keystore是密钥库文件的名称,其中包含用于对apk进行签名的密钥
1800信息

非常感谢!我们的应用已由PlayStore重新签名,这导致Google登录失败。我必须直接从PlayStore下载APK,并找到实际的SHA1才能在Google Cloud控制台中注册它。
Alvin Rusli

333

您可以使用Java 7的密钥和证书管理工具keytool来检查密钥库或APK的签名,而无需提取任何文件。

APK的签名

keytool -printcert -jarfile app.apk

输出将显示签名所有者/签发者以及APK文件的MD5,SHA1和SHA256指纹app.apk

(请注意,该-jarfile参数是Java 7中引入的;有关更多详细信息,请参阅文档。)

密钥库的签名

keytool -list -v -keystore release.jks

输出将显示密钥库文件中的别名(条目)release.jks,以及证书指纹(MD5,SHA1和SHA256)。

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


1
@goRGon您正在使用Java 7或更高版本吗?
Paul Lammertsma 2014年

2
@goRGon实际上,该-jarfile参数是Java 7引入的。我已经更新了答案。
Paul Lammertsma 2014年

41
这应该是一个公认的答案。没有解压需要
亚采Kwiecień

1
奇怪的是,Mac上仍默认提供Java 1.6。我建议更新到最新版本。
Paul Lammertsma 2014年

2
@RichardBronosky确实不是这样。我从事Android开发已经三年有余,没有做过iOS开发。不过,出于不同的原因,我同意你的要点。Java 1.6似乎是迄今为止最扩展的版本,或者至少是广泛使用的版本,虽然公认的解决方案可同时用于1.6和1.7,但该解决方案仅适用于1.7,所以我不认为这应该是公认的答案(然而!)。(还请注意,可接受的答案是2012年表格,而这个答案是2014年4月
以来的表格

17

要基于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吗?
Paul Lammertsma '16

@PaulLammertsma是的,我们是。
Artem Russakovskii

11

查看签名证书的简便得多的方法:

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

这只会显示DN,因此,如果您有两个具有相同DN的证书,则可能必须按指纹进行比较。


什么是DN?通常,我有很多行是这样的:X.509,CN = {firstname and lastname} [证书的有效期限是{date from}到{date_to}]
xliiv 2012年

DN代表“专有名称”,在您的情况下是“ CN = {firstname and lastname}”部分。
Nikolay Elenkov

6

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

解压缩apk并打开META-INF / ?. RSA文件。?应当为CERT或ANDROID或其他形式。它将显示与您的APK相关的所有信息。


4

您可以使用apksignerAndroid SDK中的工具来执行此操作:

apksigner verify --print-certs my_app.apk

您可以在build-tools目录中找到apksigner。例如: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.