Цепочка равна нулю при получении закрытого ключа

Я шифрую данные в своем приложении с помощью пары ключей RSA, которую храню в хранилище ключей Android.

Я видел NullPointerException в Play Store, но не смог их воспроизвести:

java.lang.NullPointerException: chain == null
    at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:1205)
    at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:374)
    at java.security.KeyStore.getEntry(KeyStore.java:644)
    at MyClass.getKeyStoreEntry(MyClass.java:111)

Исходный код для создания пары ключей

Calendar start = Calendar.getInstance();
start.setTimeInMillis(0);
Calendar end = Calendar.getInstance();
end.set(Calendar.YEAR, 3000);

KeyPairGeneratorSpec.Builder keySpecBuilder = new KeyPairGeneratorSpec.Builder(context)
    .setAlias(keyName)
    .setSubject(new X500Principal("CN=" + keyName))
    .setSerialNumber(BigInteger.TEN)
    .setStartDate(start.getTime())
    .setEndDate(end.getTime())
    .setKeySize(RSA_KEY_SIZE);

KeyPairGeneratorSpec spec = keySpecBuilder.build();
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
gen.initialize(spec);
gen.generateKeyPair();

И затем, чтобы получить ключ:

private KeyStore.PrivateKeyEntry getKeyStoreEntry() {
    KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
    keyStore.load(null);

    if (!keyStore.containsAlias(keyName)) {
        throw new KeyNotFoundException();
    }
    return (KeyStore.PrivateKeyEntry) keyStore.getEntry(keyName, null);
}

Это происходит только тогда, когда я использую KeyPairGeneratorSpec на уровне API 19-22. Реализация 23+ работает нормально.

У меня нет другого ключа с таким же именем и я также не удалял ключ.


person AesSedai101    schedule 24.08.2016    source источник
comment
@RED_ нет - в итоге я возвращался к старой реализации, если она терпела неудачу   -  person AesSedai101    schedule 03.10.2017
comment
Вам когда-нибудь удавалось это решить? Такая же проблема, и это расстраивает!   -  person Abushawish    schedule 23.07.2019
comment
нет, я работал над проблемой   -  person AesSedai101    schedule 25.07.2019


Ответы (2)


Я считаю, что вы просто сталкиваетесь с ошибками хранилища ключей. См., например, эту статью: Безопасность Android: Забытое хранилище ключей. В трекере Android также есть многочисленные отчеты об ошибках, связанных с хранилищем ключей, например, AndroidKeyStore удален после изменение типа блокировки экрана.

person Marcin Orlowski    schedule 26.08.2016
comment
Я использую обходные пути для этого места (если ключ не существует в хранилище ключей, я воссоздаю его), так что, к сожалению, это не проблема. - person AesSedai101; 26.08.2016

Пожалуйста, используйте непосредственно метод getKey KeyStore

private java.security.Key getSecretKey(Context context) throws Exception {
  return keyStore.getKey(XEALTH_KEY_ALIAS, null);
}
person Abhishek Hirapara    schedule 30.12.2019
comment
это пара ключей RSA, а не секретный ключ, к сожалению - person AesSedai101; 21.05.2020