无法在Android密钥库中生成密钥

我们目前遇到了一个问题,即当用户安装我们的应用程序时,应用程序尝试访问并生成密钥库中的密钥,但密钥库引发此exception:

Caused by: java.lang.IllegalStateException: could not generate key in keystore at android.security.AndroidKeyPairGenerator.generateKeyPair(AndroidKeyPairGenerator.java:100) at java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair(KeyPairGenerator.java:275) 

我们认为这与手机的解锁模式不会解锁密钥库和/或设备pipe理员locking密钥库有关。

这是如何创build密钥库以及如何生成密钥:

 public SecretKeyWrapper(Context context, String alias) throws GeneralSecurityException, IOException { mCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); final KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); if (!keyStore.containsAlias(alias)) { generateKeyPair(context, alias); } final KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, null); mPair = new KeyPair(entry.getCertificate().getPublicKey(), entry.getPrivateKey()); } private static void generateKeyPair(Context context, String alias) throws GeneralSecurityException { final Calendar start = new GregorianCalendar(); final Calendar end = new GregorianCalendar(); end.add(Calendar.YEAR, 100); final KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context) .setAlias(alias) .setSubject(new X500Principal("CN=" + alias)) .setSerialNumber(BigInteger.ONE) .setStartDate(start.getTime()) .setEndDate(end.getTime()) .build(); final KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); gen.initialize(spec); gen.generateKeyPair(); } 

有谁知道如何:

  • 作为设备pipe理员locking密钥库?
  • 当设备pipe理员locking密钥存储时解锁该密钥存储?
  • 或以另一种方式重现此问题?

Caused by: java.lang.IllegalStateException: could not generate key in keystore

希望第一个exception将通过下面的代码解决:

 KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); ks.load(null); KeyStore.Entry entry = ks.getEntry(alias, null); ks.getEntry(alias, new KeyStore.PasswordProtection(password)) 

当设备pipe理员locking密钥存储时,解锁密钥存储:

KeyStore不仅可以在ICS前的设备上看起来locking。 获取KeyStorelocking的最简单方法是:

  1. 通过设置KeyGuard(模式,引脚或密码锁屏)来初始化KeyStore
  2. 添encryption钥或您在KeyStore中存储的任何内容
  3. 转到设置>安全,并将屏幕locking更改为“不安全”,例如幻灯片。
  4. 重新启动您的设备。

设备启动后,KeyStore将被locking。 com.android.credentials.UNLOCK意图将启动com.android.settings.CredentialStorage活动,而这又会显示UnlockDialog,提示input密码。

  * KeyStore: LOCKED * KeyGuard: OFF/ON * Action: old unlock dialog * Notes: assume old password, need to use it to unlock. * if unlock, ensure key guard before install. * if reset, treat as UNINITALIZED/OFF 

您可以生成一个主密钥,并将其作为私人文件存储,其他应用程序将无法读取它,所以你会在没有根的设备上很好。 这是Android开发者博客推荐的方法:: http://android-developers.blogspot.jp/2013/02/using-cryptography-to-store-credentials.html