KeyPairGenerator.generateKeyPair() в Android 7.1.1

Мы видели приток следующих исключений и только для Android 7.1.1 (API 25). Что-то изменилось в 7.1.1, чтобы это не сработало?

java.security.ProviderException: Failed to load generated key pair from keystore
    at android.security.keystore.AndroidKeyStoreKeyPairGeneratorSpi.loadKeystoreKeyPair(AndroidKeyStoreKeyPairGeneratorSpi.java:518)
    at android.security.keystore.AndroidKeyStoreKeyPairGeneratorSpi.generateKeyPair(AndroidKeyStoreKeyPairGeneratorSpi.java:470)

Санитизированный код ниже (может иметь небольшие ошибки копирования и вставки)

 KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
    String certInfo = String.format(Locale.ROOT, "CN=%s, OU=%s", new Object[]{"KeyName", context.getPackageName()});
  generator.initialize(new KeyPairGeneratorSpec.Builder(context)).setAlias("KeyName").setSubject(new X500Principal(certInfo)).setSerialNumber(BigInteger.ONE).setStartDate(start).setEndDate(end).build());
  generator.generateKeyPair();

person fobbymaster    schedule 23.01.2017    source источник


Ответы (1)


Я видел эту ошибку раньше, и, скорее всего, она вызвана устаревшим KeyPairGeneratorSpec, для API > 23 следует использовать KeyGenParameterSpec вместо.

Если вы ориентируетесь на API ниже 23, я предлагаю вам использовать какой-то механизм для использования разных спецификаций в зависимости от уровня API.

AlgorithmParameterSpec spec;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
    spec = new KeyGenParameterSpec.Builder(KEY_ALIAS, purposes)
                 .setCertificateSubject(new X500Principal("CN=" + KEY_ALIAS))
                 .setCertificateSerialNumber(BigInteger.TEN)
                 .setCertificateNotBefore(start.getTime())
                 .setCertificateNotAfter(end.getTime())
                 .build();
} else {
    spec = new KeyPairGeneratorSpec.Builder(Application.getApp().getApplicationContext())
                 .setAlias(KEY_ALIAS)
                 .setSubject(new X500Principal("CN=" + KEY_ALIAS))
                 .setSerialNumber(BigInteger.TEN)
                 .setStartDate(start.getTime())
                 .setEndDate(end.getTime())
                 .build();
}
KeyPairGenerator kpg = KeyPairGenerator.getInstance(KEY_ALGORITHM_RSA, AndroidKeyStore);
kpg.initialize(spec);
kpg.generateKeyPair();

Сбой, вероятно, связан с тем, что некоторые производители могут удалять устаревшие методы в своих последних сборках Android, поэтому он не будет падать на всех устройствах, использующих API> 23, а только на некоторых из них.

Этот вопрос уже обсуждался здесь в SO.

person JJGuerrero    schedule 01.08.2017