从apk文件获取证书详细信息

58

我该如何获取apk签名证书的详细信息。我有一堆使用不同证书签名的apks,我想按照它们的证书分组。

我可以使用jarsigner获取证书到期日的详细信息并完成我的任务,但我很好奇是否可以获取更多详细信息或提取公钥(我相信它存储在META-INF/cert.RSA中,但无法读取)。


你可以通过从应用程序中提取X509证书来完成runtime,这也应该会给你公钥。 - Jens
2
我想不用代码来完成它(请不要伤害我,stackoverflow) - Ravi Vyas
1
可能是如何在Android设备上查看签名apk的人的身份? 的重复问题。 - Victor Ronin
5个回答

63

请尝试以下操作:

openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text

11
你也可以使用Java的keytool命令获取一些信息:keytool -printcert -file CERT.RSA,但是openssl提供了更详尽的输出,所以我更喜欢使用它。 - pevik
谢谢。出于好奇,输出的哪一部分是指纹?我尝试使用Signal APK(https://signal.org/android/apk/)提取META-INF / CERTIFIC.RSA,但无法在输出中找到与其网站上列出的Signal指纹相匹配的值。 - iangetz
1
@iangetz请看这个问题:https://dev59.com/zbHma4cB1Zd3GeqPT_sh - Yury

50

unzip -p Name-of-apk.apk META-INF/CERT.RSA | keytool -printcert 是我所使用的。

它会生成一些信息,例如所有者颁发者序列号有效期限证书指纹签名算法版本号


35

最简单的方法:

keytool -printcert -jarfile file.apk

这也适用于Android应用程序包(.aab)


我已经使用这个命令很长时间了。最近我注意到keytool在输出中已经停止显示MD5了。有猜测为什么会这样吗?尝试了很多搜索但没有成功。 - node_analyser
添加 -v 选项可以同时获取 MD5。 - Randy Sugianto 'Yuku'
这太奇怪了。之前我也会得到MD5。我对为什么现在会发生这种情况毫无头绪。 - node_analyser
我也尝试过询问与此相关的问题,但同样没有成功。 https://stackoverflow.com/questions/55336382/md5-missing-from-keytool-command-when-fired-for-apk/ - node_analyser

25

根据现有答案,以下是使用 openssl 进行即时操作的命令行 (解压并将证书传递给管道而不是定义 -infile 选项):

unzip -p App.apk META-INF/CERT.RSA |openssl pkcs7 -inform DER -noout -print_certs -text

没有SHA1。 - HendraWD

19

您可以使用 Android SDK 中的 ApkSigner,而无需解压缩 APK 文件,具体请参考以下内容:

apksigner.jar verify --print-certs myApplication.apk

5
好的。请注意,从Android 7开始,引入了一种新的签名方案(V2),将生成不包含CERT.RSA的APK文件。因此,旧方法(使用openssl / keytool)将无法使用。(参见:https://source.android.com/security/apksigning/v2) - David Lev
1
还要注意,您必须从工具的lib目录运行它:java -jar ~/android-sdk/build-tools/28.0.0-rc1/lib/apksigner.jar - kenyee
@DavidLev 所以,这个命令给了我们一个可以比较的值,对吧?但我有点迷失了... 我应该如何处理从“msgDigest.digest(sigs[0].toByteArray())”得到的byte[]值和这个值呢? - Jenix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接