Я использую хранилище ключей (формат BKS) в своем приложении для Android для хранения общедоступных закрытых пар ключей. Приложение использовалось долгое время и имело 10+ пар открытых и закрытых ключей. Внезапно перестала работать одна из основных функций приложения. Основная причина была обнаружена в следующем:
В файле BKS осталась только одна пара открытых закрытых ключей. Все остальные пары ключей потеряны. Я проверил в коде, что KeyStore.deleteEntry (псевдоним) нигде в приложении не вызывается. Единственное место, где я мог найти, если что-то пошло не так, это следующее:
Мы создаем пару ключей и устанавливаем ее, используя:
KeyStore.setKeyEntry(keyId, keyPair.getPrivate(), getKeyStorePassword(), certChain);
В javadoc вышеупомянутого метода указано следующее: Если данный псевдоним уже существует, информация о хранилище ключей, связанная с ним, переопределяется данным ключом (и, возможно, цепочкой сертификатов).
Обычно строка, полученная с сервера, которая является UUID, используется как псевдоним для установки новой KeyPair в KeyStore. Таким образом, вероятность того, что новый псевдоним будет таким же, как тот, который уже присутствует в хранилище ключей, очень маловероятна. Даже если это так, он просто переопределил бы одну пару ключей. Но в этом случае теряется около 10+ пар ключей.
Кто-нибудь знает о каких-либо известных проблемах, которые приводят к такой потере пары ключей?
Дополнительная информация:
Я обнаружил, что сертификат, связанный с открытым ключом для каждой пары ключей, действителен только в течение 1 года. Я думал, что пары ключей, для которых истек срок действия сертификата, могут быть удалены при установке новой пары ключей в хранилище ключей. Но когда я выполнил тестовый пример, изменив срок действия на 30 дней и изменив время устройства более чем на 30 дней, проблема не могла быть воспроизведена.
Еще одна вещь, в которой я не уверен, актуальна ли она для этой проблемы: в настоящее время серийный номер для всех генерируемых сертификатов - BigInteger.ONE:
X509v1CertificateBuilder certBuilder = новый JcaX509v1CertificateBuilder ( subject, BigInteger.ONE, notBefore, notAfter, subject, keyPair.getPublic ());
Я думаю, что это неправильно, но я не уверен, может ли это привести к моей проблеме.
Ниже приведен список поставщиков безопасности (Security.getProviders()) на устройстве, на котором была обнаружена эта проблема:
Итак, все криптографические операции Java выполняются с использованием AndroidKeyStoreBCWorkaround версии 1.0. Устройство - Nexus 5, Android 6.0.1.




@ nikolay-elenkov, не могли бы вы дать несколько советов?