Я исправил свою проблему, отключив preDexLibraries для всех модулей:
dexOptions {
preDexLibraries true
...
Вы спросили:
Как узнать, какой сертификат и откуда загрузить?
blockquote>Вы, как проверяющий, должны иметь этот доверенный сертификат в своем распоряжении. в какой-то форме. С Windows было бы хорошо, если бы этот сертификат был установлен в вашем хранилище сертификатов. Это то, что я предположил в своем ответе. Если вы не знаете, где находится сертификат, вам придется сначала выяснить это, в противном случае вы не сможете должным образом проверить подпись. Таким образом, подписчик должен предоставить сертификат верификатору (вам), по доверенному каналу.
Вы также написали:
В OpenSSL есть хорошая команда
blockquote>openssl smime -verify -inform der -in LOCALSIG.DSA -content LOCALSIG.SF -noverify
, которая делает именно то, что я хочу.Вы уверены, что это именно то, что вы хотите сделать? Поскольку вы передаете флаг
-noverify
, все, что делает эта команда, проверяет, чтоLOCALSIG.DSA
содержит правильную подпись содержимогоLOCALSIG.SF
. Однако он не подтверждает, что эта подпись была создана удостоверением, которому вы доверяете. Любой человек с действительным сертификатом и парой ключей мог создать эту подпись.Чтобы проверить подпись, в том числе личность подписавшего, в версии stock-openssl, вам нужна вся цепочка сертификатов, доступная вам в формате, понятном openssl (PEM или DER), вплоть до самого себя. подписанный корневой сертификат. Затем вы можете проверить это с помощью немного другой команды
openssl smime -verify -inform der -in LOCALSIG.DSA -content LOCALSIG.SF -CAfile trusted-cert.pem
Ваш вопрос обновлен, чтобы указать, что сертификат подписи самоподписан и находится в хранилище сертификатов. Существует еще несколько возможных маршрутов, но я предполагаю, что на данный момент вы знаете, какое имя субъекта подписавшего, который, как вы ожидаете, сгенерировал эту подпись. (Если нет, то укажите, что вы делаете ожидаете.) С этой информацией вы можете использовать следующие шаги для проверки вашей подписи:
Первое использование
CertEnumCertificatesInStore()
[119 ] посмотреть сертификат в хранилище сертификатов. Пример использования см. В . Пример программы C: список сертификатов в хранилище .Если у вас есть дескриптор этого сертификата, используйте
CryptImportPublicKeyInfoEx2()
, чтобы получить дескриптор требуемого открытого ключа.Этот дескриптор типа
BCRYPT_KEY_HANDLE
вы можете использовать сBCryptVerifySignature()
для проверки.