Android 7.1.1中的KeyPairGenerator.generateKeyPair()

Android 7.1.1中的KeyPairGenerator.generateKeyPair(),android,android-keystore,key-pair,android-7.1-nougat,Android,Android Keystore,Key Pair,Android 7.1 Nougat,我们已经看到了以下例外情况的涌入,并且仅限于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(AndroidKeyStoreKeyPa

我们已经看到了以下例外情况的涌入,并且仅限于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)
下面的净化代码(可能有轻微的复制粘贴错误)


我以前见过这个错误,它很可能是由的不推荐引起的,因为API>23应该改用

如果您的目标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的设备上崩溃,而只会在其中一些设备上崩溃

这件事以前已经讨论过了

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();