2012-12-03 59 views
11

我有一个用于签署各种JAR的公用密钥的MD5哈希库,以及我们用于签署不同APK的各自密钥库的映射。我希望能够做的是确定哪个密钥库用于签署APK,但不使用试验和错误。 (另外,可悲的是,我们的许多密钥共享相似或相同的DN。)从已签名的APK或JAR中提取原始X.509证书

我的解决方案,因为我知道META-INF/FOO.RSA(或FOO.DSA)包含证书, APK的RSA文件并直接计算MD5散列。 (我知道证书是存在的,因为它是一个运行Android应用程序访问,以及文档的jarsigner告诉我它的存在。)

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

回答

22

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

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

+1

非常感谢!我刚刚得到一个脚本工作。 对于那些好奇,.RSA文件似乎有以下模式: * 54字节的未知信息 *一个2字节的短(大端)与即将到来的证书的长度 *的n个字节证书 *未知 –