Android 4.3 KeyStore – chain == null при попытке получить ключи

Следуя этому блогу , я использую этот код для создания и хранения KeyPair в Android KeyStore:

 Context ctx = getApplicationContext(); Calendar notBefore = Calendar.getInstance(); Calendar notAfter = Calendar.getInstance(); notAfter.add(1, Calendar.YEAR); KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx). setAlias(RSA_KEYS_ALIAS).setSubject( new X500Principal(String.format("CN=%s, OU=%s", getApplicationName(), ctx.getPackageName()))). setSerialNumber(BigInteger.ONE). setStartDate(notBefore.getTime()).setEndDate(notAfter.getTime()).build(); KeyPairGenerator kpGenerator; try { kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); kpGenerator.initialize(spec); kpGenerator.generateKeyPair(); } catch (Exception e) { showException(e); } 

Когда я пытаюсь извлечь открытый ключ из KeyStore с помощью этого кода, генерируется исключение NullPointerException с chain == null сообщений chain == null .

 public RSAPublicKey getRSAPublicKey() { RSAPublicKey result = null; try { KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(RSA_KEYS_ALIAS, null); // --< exception is thrown here result = (RSAPublicKey) keyEntry.getCertificate().getPublicKey(); } } catch (Exception e) { showException(e); } return result; } 

То же самое происходит с кодом для получения закрытого ключа.

Обновить:

Я сравнил свой код с образцом Google BasicAndroidKeyStore . Механизм генерации, хранения и извлечения пары ключей в этом образце практически не отличается от того, что я реализовал. Я озадачен тем, почему этот код прекратил функционировать после нескольких месяцев безупречной работы.

Любые предложения или подсказки будут оценены.

По-видимому, имена в Android KeyStore должны быть уникальными среди всех приложений. У меня было другое приложение, которое использовало одно и то же имя для своих ключей. После изменения общей библиотеки, используемой обоими приложениями для создания и использования ключей для включения имени пакета в его ключевые имена, проблема исчезла …

В моем случае у меня было несколько вызовов, чтобы получить KeyStore почти одновременно. Я должен был создать один экземпляр и ссылаться на него, если он существует, иначе KeyStore.getInstance("AndroidKeyStore") возвращает null и создает исключение. Чтобы защитить от множественных асинхронных запросов, вызвавших сбой, используйте хранимый экземпляр только из одного KeyStore.getInstance() .

Intereting Posts
Кнопка Android назад не работает Массовая вставка на Android-устройстве Невозможно вызвать getSupportFragmentManager () из действия Textview setCompoundDrawables не меняет или не показывает Android: рисование на холсте, способ сделать нижние левые соответствуют (0,0)? Как обрабатывать событие «вставить» в Android 3.0 (Honeycomb)? Сетевой провайдер не работает в android CollapsingTolbar работает с файлом, содержащим SwipeRefreshLayout и RecycleView Linux Ubuntu Android SDK менеджер не запускается – андроид: java: не найден Анимированные вложенные фрагменты Android Android: какой лучший способ хранить данные JSON в автономном режиме для приложения в Android? Любой способ поддержать samsung galaxy s4 с использованием совместимых размеров экрана IllegalStateException: PagerAdapter приложения изменил содержимое адаптера, не вызывая PagerAdapter # notifyDataSetChanged Параметры HttpGet не отправляются RxJava: как конвертировать список объектов в список других объектов