2017-01-23 104 views
3

我们已经看到以下异常的涌入,并且仅适用于Android 7.1.1(API 25)。 7.1.1有什么改变,使其失败?Android 7.1.1中的KeyPairGenerator.generateKeyPair()

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) 
下面

的Sanitized代码(可能有轻微的复制粘贴错误)

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

回答

1

我以前见过这个错误,它是最有可能的KeyPairGeneratorSpec弃用引起的,API> 23,你应该使用代替KeyGenParameterSpec

如果您的目标是低于23的API,我建议您根据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之前已经讨论过here