Ich bekomme einen Fehler beim Versuch, einen Schlüssel für bestimmte Geräte zu generieren. Ich kann den Fehler auf einem Samsung Galaxy Note mit 4.4.2 reproduzieren.Android Keystore Error "Schlüssel konnte nicht im Keystore generiert werden"
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)
at com.eric.demo.MainActivity.generateKeyPair(MainActivity.java:65)
at com.eric.demo.MainActivity.onClickButton(MainActivity.java:43)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at android.view.View$1.onClick(View.java:3964)
at android.view.View.performClick(View.java:4640)
at android.view.View$PerformClick.run(View.java:19421)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5476)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
Ich habe eine kleine App nur durch Kopieren der Code Zeile für Zeile aus dem Android-Entwickler-Seite https://developer.android.com/training/articles/keystore.html unter einen Schlüssel generieren „Generieren eines neuen privaten Schlüssel.“
public void onClickButton (View view) {
try {
generateKeyPair(this, "test3");
} catch (Exception e){
Log.wtf("exception", e);
}
}
private void generateKeyPair(Context context, String alias)
throws Exception {
Calendar cal = Calendar.getInstance();
Date now = cal.getTime();
cal.add(Calendar.YEAR, 1);
Date end = cal.getTime();
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpg.initialize(new KeyPairGeneratorSpec.Builder(getApplicationContext())
.setAlias(alias)
.setStartDate(now)
.setEndDate(end)
.setSerialNumber(BigInteger.valueOf(1))
.setSubject(new X500Principal("CN=test3"))
.build());
KeyPair kp = kpg.generateKeyPair();
}
Der Fehler erscheint in kpg.generateKeyPair(), nach innen AndroidKeyPairGenerator.java auftreten:
if (!mKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF, keyType,
mSpec.getKeySize(), mSpec.getFlags(), args)) {
throw new IllegalStateException("could not generate key in keystore");
}
und in KeyStore.java:
public boolean generate(String key, int uid, int keyType, int keySize, int flags,
byte[][] args) {
try {
return mBinder.generate(key, uid, keyType, keySize, flags, args) == NO_ERROR;
} catch (RemoteException e) {
Log.w(TAG, "Cannot connect to keystore", e);
return false;
}
}
Die mBinder.generate() Aufruf scheint 2 zurückzugeben, was bedeutet, dass der Keystore gesperrt ist?
1. Einstellung Verschlüsselung erforderlich:
// ResponseCodes
public static final int NO_ERROR = 1;
public static final int LOCKED = 2;
public static final int UNINITIALIZED = 3;
public static final int SYSTEM_ERROR = 4;
public static final int PROTOCOL_ERROR = 5;
public static final int PERMISSION_DENIED = 6;
public static final int KEY_NOT_FOUND = 7;
public static final int VALUE_CORRUPTED = 8;
public static final int UNDEFINED_ACTION = 9;
public static final int WRONG_PASSWORD = 10;
Der Fehler könnte etwas mit dem Schlüsselspeicher https://code.google.com/p/android/issues/detail?id=177459&q=could%20not%20generate%20key%20in%20keystore&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars
Ein paar Dinge, die ich einzeln und Kombinationen der folgenden versucht haben zu diesem Thema zusammenhängen. Das Ergebnis ist ein weiterer Fehler: "Der Android-Keystore muss initialisiert und entsperrt sein, wenn eine Verschlüsselung erforderlich ist"
2. Einen Sperrbildschirm einstellen (Muster, PIN, NONE, Passwort, Swipe). Gleiches Verhalten 3. Programmgesteuertes Entsperren oder Zurücksetzen des Anmeldeinformationenspeichers mit startActivity(new Intent("com.android.credentials.UNLOCK"));
oder startActivity(new Intent("com.android.credentials.RESET"));
Der Versuch, die Sperre aufzuheben, zeigt die Meldung "Kennwort für Anmeldeinformationenspeicher eingeben", in der kein sinnvolles Kennwort funktioniert, und das Löschen der Anmeldeinformationen hilft auch nicht.
Ich habe diese Problemumgehung an anderen Stellen gesehen, sieht aber nicht so aus, als hätten Sie diese Kombination ausprobiert: Wenn der Sperrbildschirm deaktiviert ist: App deinstallieren, Sperrbildschirm festlegen, Sperrbildschirm aufheben und dann neu installieren. Wenn der Sperrbildschirm aktiviert ist, deinstallieren Sie ihn, heben Sie den Sperrbildschirm auf, stellen Sie den Sperrbildschirm ein und installieren Sie ihn neu. Ich habe kein Gerät zum Reproduzieren, aber ich suche nach einem Workaround für einen meiner Benutzer. –
Wenn Sie aufgefordert werden, "Kennwort für Anmeldeinformationenspeicher einzugeben", ist das richtige Kennwort möglicherweise die Fallback-PIN, die Sie beim Festlegen des Musters auswählen. Zumindest war das mein Fall. – JerabekJakub