2015-06-26 23 views
38

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.

+0

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. –

+0

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

Antwort

-4

Ich denke, das ist die richtige Richtung: Rechtsklick auf Projekt> Android Tools> Signiertes Anwendungspaket exportieren Der Assistent zum Exportieren von Android-Anwendungen wird angezeigt. Wählen Sie das Projekt aus, das ich exportieren möchte, und klicken Sie auf Weiter. Der Keystore-Auswahlbildschirm wird angezeigt.

2

Während ich die vollständige Antwort nicht kenne, kann ich Ihnen helfen, Ihre Suche fortzusetzen. Die Binderimplementierung auf der anderen Seite von mBinder ist die native keystore. Wenn ich mich vollständig erinnere, besteht das Verhalten darin, 1) Schlüsseloperationen auf Softwareebene zu unterstützen oder 2) an eine OEM-bereitgestellte Keymaster-Bibliothek zu delegieren, die (vermutlich) eine Schnittstelle zum hardwaregestützten Keystore des OEMs hat. Weitere Informationen hierzu finden Sie unter here, here und here.

Hinweis: Ich verzichte auf die normale Politik von SO, den Inhalt des externen Links in die Antwort zu ziehen, da ich Sie mit drei Artikeln verlinke, die alle> 1 Seite sind und es scheint ein bisschen lächerlich, einen 6- Seitenantwort ;-)

0

Wenn Ihr Code in Ordnung ist, denken Sie daran, dass Sie für Ihr Gerät eine PIN/PW/Fingerabdruck (Secure Unlock) einrichten müssen, damit der Keystore funktioniert. Wenn Sie versuchen, Schlüsselpaare zu generieren, wird ein solcher Fehler angezeigt.

Verwandte Themen