2017-01-23 50 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