web-dev-qa-db-ja.com

Androidキーストアでキーを生成できません

現在、ユーザーがアプリをインストールすると、アプリがキーストアのキーにアクセスして生成しようとするが、キーストアが次の例外をスローするという問題が発生しています。

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

誰かが方法を知っていますか:

  • キーストアをデバイス管理者としてロックしますか?
  • デバイス管理者によってロックされたときにキーストアのロックを解除しますか?
  • または、この問題を別の方法で再現しますか?
22

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をロックする最も簡単な方法は次のとおりです。

  1. KeyGuard(画面ロックのパターン、PIN、またはパスワード)を設定して、KeyStoreを初期化します。
  2. キーまたはKeyStoreに保存するものを追加します
  3. [設定]> [セキュリティ]に移動し、画面ロックを「セキュリティで保護されていない」もの(スライドなど)に変更します。
  4. デバイスを再起動します。

デバイスが起動すると、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パスワードなしでキーストアを初期化しています

11