从已签名的APK或JAR中提取原始X.509证书

时间:2012-12-03 22:29:30

标签: java android keystore jar-signing jarsigner

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

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

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

2 个答案:

答案 0 :(得分:26)

提取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

答案 1 :(得分:1)

Hexdump FOO.RSA。最后n个字节是签名本身,其中n取决于密钥长度(例如,1024位RSA)。如果使用相同的密钥对某些内容进行两次签名,则可以对.RSA文件进行区分,并确保只有最后n个字节发生变化。文件的静态部分是证书,更改的位是FOO.sf的哈希上的签名。证书和签名之间可能还有一个分隔符,您还必须删除它。