Сертификат KeyStore нулевой на старых устройствах (5.0+) - PullRequest
0 голосов
/ 26 марта 2019

Я использую 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.

Спасибо!

...