Я использую KeyStore для безопасного сохранения электронной почты и пароля, и это прекрасно работает на новых устройствах.
На некоторых старых, таких как Lenovo A1010 (Android 5.1 - 22), я получаю нулевое значение при попытке получить сертификат.
private static void createKeysPreM(@NonNull Context context, @NonNull final String alias) throws NoSuchProviderException,
NoSuchAlgorithmException, InvalidAlgorithmParameterException {
final Calendar start = new GregorianCalendar();
final Calendar end = new GregorianCalendar();
end.add(Calendar.YEAR, KEY_VALIDITY_YEARS);
final KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
// You'll use the alias later to retrieve the key. It's a key for the key!
.setAlias(alias)
.setSubject(new X500Principal("CN=" + alias))
.setSerialNumber(BigInteger.valueOf(Math.abs(alias.hashCode())))
// Date range of validity for the generated pair.
.setStartDate(start.getTime()).setEndDate(end.getTime())
.build();
KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance(
SecurityConstants.TYPE_RSA,
SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
kpGenerator.initialize(spec);
}
private Certificate getCertificate() {
try {
final KeyStore ks = KeyStore.getInstance(SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
ks.load(null);
return ks.getCertificate(KEY_STORE_ALIAS); //NULL ???
} catch (Exception e) {
Timber.d(e);
return null;
}
}
public interface SecurityConstants {
String KEYSTORE_PROVIDER_ANDROID_KEYSTORE = "AndroidKeyStore";
String TYPE_RSA = "RSA";
String PADDING_TYPE = "PKCS1Padding";
String BLOCKING_MODE = "NONE";
}
Есть идеи, почему это может произойти? Я не получаю никаких исключений, только null в методе getCertificate.
Спасибо!