12

我有一个用于签署各种 jar 的公钥的 MD5 哈希库,以及到它们各自的密钥库的映射,我们使用这些密钥库来签署不同的 APK。我想做的是确定哪个密钥库用于签署 APK,但不使用反复试验。(此外,遗憾的是,我们的许多密钥共享相似或相同的 DN。)

我的解决方案,因为我知道 META-INF/FOO.RSA(或 FOO.DSA)包含证书,是从 APK 的 RSA 文件中提取证书并直接计算 MD5 哈希。(我知道证书在那里,因为它可以被正在运行的 android 应用程序访问,并且 jarsigner 文档告诉我它在那里。)

但我找不到任何工具可以为我提供证书的实际字节。当我使用 时,我可以获得 DN 和证书元数据jarsigner -verbose -verify -certs my.apk,但这并没有给我字节。

4

2 回答 2

28

提取 JAR,然后使用“openssl”输出证书:

因此,假设 'foo.jar' 在您的当前目录中,请执行以下操作:

mkdir temp
cd temp
jar -xvf ../foo.jar
cd META-INF
openssl pkcs7 -in FOO.RSA -print_certs -inform DER -out foo.cer
于 2013-03-22T17:50:33.433 回答
1

Hexdump FOO.RSA。最后 n 个字节是签名本身,其中 n 取决于密钥长度(例如,1024 位 RSA)。如果您使用相同的密钥签署两次,您可以比较 .RSA 文件并看到只有最后 n 个字节发生变化;文件的静态部分是证书,更改的位是 FOO.sf 哈希上的签名。您还必须删除证书和签名之间的分隔符。

于 2013-02-19T02:18:02.397 回答