我们已经看到大量以下异常,仅适用于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();
答案 0 :(得分:2)
之前我看到过这个错误,很可能是由于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但仅限于其中一些。
此问题已在之前的here中讨论过。