現在、ユーザーがアプリをインストールすると、アプリがキーストアのキーにアクセスして生成しようとするが、キーストアが次の例外をスローするという問題が発生しています。
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)
電話のロック解除パターンがキーストアのロックを解除しないか、デバイス管理者がキーストアをロックすることに関係していると考えられます。
キーストアの作成方法とキーの生成方法は次のとおりです。
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();
}
誰かが方法を知っていますか:
Caused by: Java.lang.IllegalStateException: could not generate key in keystore
以下のコードで最初の例外が解決されることを願っています。
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(alias, null);
ks.getEntry(alias, new KeyStore.PasswordProtection(password))
デバイス管理者によってロックされたキーストアのロックを解除します。
KeyStore
は、ICS以前のデバイスだけでなくロックされているように見える場合があります。 KeyStore
をロックする最も簡単な方法は次のとおりです。
デバイスが起動すると、KeyStoreがロックされます。 com.Android.credentials.UNLOCK
インテントが開始されますcom.Android.settings.CredentialStorage
アクティビティ。これにより、UnlockDialogが表示され、パスワードの入力を求められます。
* 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
マスターキーを生成してプライベートファイルとして保存するだけで、他のアプリはそれを読み取ることができないため、root化されていないデバイスでも問題ありません。これは、Android Developers Blog :: http://Android-developers.blogspot.jp/2013/02/using-cryptography-to-store-credentials)で推奨されているアプローチです。 .html
同じ質問の答え: Android android.credentials.UNLOCKパスワードなしでキーストアを初期化しています