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

xli*_*iiv 232 android digital-signature android-keystore

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

我如何匹配最初使用哪个密钥库来对我的机器上的各种密钥库进行签名?

azg*_*fer 373

首先,解压缩APK并解压缩文件/META-INF/ANDROID_.RSA(此文件也可能是CERT.RSA,但应该只有一个.RSA文件).

然后发出以下命令:

keytool -printcert -file ANDROID_.RSA
Run Code Online (Sandbox Code Playgroud)

您将获得如下证书指纹:

     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
Run Code Online (Sandbox Code Playgroud)

然后再次使用keytool打印出签名密钥库的所有别名:

keytool -list -keystore my-signing-key.keystore
Run Code Online (Sandbox Code Playgroud)

您将获得别名列表及其证书指纹:

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
Run Code Online (Sandbox Code Playgroud)

瞧!我们现在可以确定apk已经使用此密钥库签名,并使用别名'android_key'.

Keytool是Java的一部分,因此请确保您的PATH中包含Java安装目录.

  • Google 推出了[两种新的 APK 签名方案](https://source.android.com/security/apksigning),这两种方案均不使用带有嵌入文件的传统 JAR 签名。`keytool` 无法读取这些签名。请改用 [apksigner](/sf/answers/4048140071/)。 (3认同)
  • @Thoman my-signing-key.keystore是包含用于签名apk的密钥的密钥库文件的名称 (2认同)

Pau*_*sma 288

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

APK的签名

keytool -list -printcert -jarfile app.apk
Run Code Online (Sandbox Code Playgroud)

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

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

密钥库的签名

keytool -list -v -keystore release.jks
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这应该是一个公认的答案.不需要解压缩 (35认同)
  • 这也适用于 Android 应用程序包 .aab 文件:-) (3认同)
  • @goRGon确实,`-jarfile`参数是在Java 7中引入的.我已经更新了答案. (2认同)
  • @RichardBronosky事实并非如此.我已经成为Android开发人员超过三年没有做iOS开发.但是,出于不同的原因,我同意你的要点.Java 1.6似乎是迄今为止扩展最多的版本,或者至少是广泛使用的版本,虽然公认的解决方案适用于1.6和1.7,但这个版本只适用于1.7,所以我不认为这应该是公认的答案(然而!).(另请注意,接受的答案是2012年的表格,而这个答案是从2014年4月开始) (2认同)

Art*_*kii 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
Run Code Online (Sandbox Code Playgroud)

或者如果您只关心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
Run Code Online (Sandbox Code Playgroud)


Nik*_*kov 11

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

jarsigner.exe -verbose -verify -certs myapk.apk
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*ist 11

您可以使用apksigner作为 Android SDK 一部分的工具执行此操作:

apksigner verify --print-certs my_app.apk

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

  • `apksigner` 不会打印 *split* apk 的证书(那些与作为捆绑包 (**aab**) 分发的应用程序的 **base.apk** 一起提供的证书;`keytool` 会打印证书。 (3认同)

Han*_*nif 6

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

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