Извлеките сертификат raw X. 509 из подписанного APK или JAR

У меня есть библиотека MD5 хэшей открытых ключей, используемых для подписи различных банок, и сопоставление с их соответствующими хранилищами ключей, которые мы используем для подписи разных APKs. Я хотел бы определить, какое хранилище ключей было использовано для подписания APK, но без использования проб и ошибок. (Кроме того, к сожалению, многие из наших ключей имеют одинаковый или идентичный DNs.)

мое решение, потому что я знаю META-INF/FOO.RSA (или FOO.DSA) содержит сертификат, должен был извлечь сертификат из Файл RSA APK и непосредственно вычислить хэш MD5. (Я знаю, что сертификат есть, потому что он доступен для запущенного приложения android, и документация jarsigner говорит мне, что он есть.)

но я не могу найти инструмент, который дает мне фактические байты сертификата. Я могу получить DN и метаданные сертификата, когда я использую jarsigner -verbose -verify -certs my.apk, но это не дает мне байты.

2 ответов


извлеките банку, затем используйте 'openssl' для вывода сертификата:

Итак, предполагая ' foo.банку в вашем текущем каталоге, сделать что-то вроде:

mkdir temp
cd temp
jar -xvf ../foo.jar
cd META-INF
openssl pkcs7 -in FOO.RSA -print_certs -inform DER -out foo.cer

Hexdump FOO.ЮАР. Последние n байт, сама подпись, где N зависит от длины ключа (например, 1024 бит RSA). Если вы подпишите что-то дважды одним и тем же ключом, вы можете отличить .Файлы RSA и видят, что только последние N байтов изменяются; статическая часть файла является сертификатом, а биты, которые изменяются, - это подпись на хэше FOO.научная фантастика. Между сертификатом и подписью может быть разделитель, который вам также придется удалить.