Действительно, это не конкретный вопрос для Android, а вопрос в целом по Java, однако я все равно выкладываю ответ ...
Прежде всего: подписан только файл XXX.SF;это означает, что все файлы, упомянутые в файле XXX.SF, подписаны «косвенно», поскольку XXX.SF содержит их хэши.На самом деле все файлы, не находящиеся в «Meta-Inf», должны иметь там хэши!Весь архив .apk не подписан.
Файл XXX.SF является более или менее копией файла MANIFEST.MF.Существует строка "SHA1-Digest-Manifest", которая является хешем SHA-1 самого файла "MANIFEST.MF";строки "SHA1-Digest" содержат не хэши файлов, а хэши дерева, соответствующие строкам в файле Manifest.MF, так:
SHA1 ("Имя: имя файла" + CR + LF +"SHA1-Digest:" + SHA1 (file_content) + CR + LF + CR + LF)
Формат файла XXX.DSA / .RSA такой же, как для подписи электронной почты S / MIME (длясодержание XXX.SF), однако данные не закодированы в base64 и не используются заголовки / строки трейлера."openssl smime -sign -outform DER" создаст этот формат.
Для подписи файла ZIP можно использовать несколько сертификатов.В этом случае будет существовать несколько пар (XXX.SF / .RSA, YYY.SF / .RSA, ...).