2015-06-26 23 views
38

Viene visualizzato un errore durante il tentativo di generare una chiave per determinati dispositivi. Sono in grado di riprodurre l'errore su un Samsung Galaxy Note in esecuzione 4.4.2.Errore keystore Android "Impossibile generare la chiave nel keystore"

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) 

ho creato una piccola applicazione solo a generare una chiave copiando il codice riga per riga dalla pagina sviluppatore Android https://developer.android.com/training/articles/keystore.html sotto "Creazione di una nuova chiave privata."

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

L'errore sembra verificarsi in kpg.generateKeyPair(), all'interno AndroidKeyPairGenerator.java:

if (!mKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF, keyType, 
     mSpec.getKeySize(), mSpec.getFlags(), args)) { 
    throw new IllegalStateException("could not generate key in keystore"); 
} 

e 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; 
    } 
} 

Il mBinder.generate() la chiamata sembra restituire 2, il che significa che il keystore è bloccato?

// 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; 

L'errore potrebbe essere in qualche modo legati a questo problema con l'archivio di chiavi https://code.google.com/p/android/issues/detail?id=177459&q=could%20not%20generate%20key%20in%20keystore&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

Un paio di cose che ho provato individualmente e combinazioni delle seguenti operazioni: crittografia
1. impostazione desiderata. Il risultato è un altro errore: "Il keystore Android deve essere in stato inizializzato e sbloccato se è richiesta la crittografia"
2. Impostazione di una schermata di blocco (schema, PIN, NONE, password, scorrimento). Stesso comportamento
3. Tentativo di sbloccare o reimpostare la memoria credenziali con startActivity(new Intent("com.android.credentials.UNLOCK")); o startActivity(new Intent("com.android.credentials.RESET")); Tentativo di sblocco mostra un messaggio di "immissione della password per l'archiviazione delle credenziali", in cui non funziona alcuna password ragionevole e persino la cancellazione delle credenziali non è di aiuto.

+0

Ho visto questa soluzione alternativa in altri punti, ma non sembra che tu abbia provato questa combinazione esatta: Se la schermata di blocco è disabilitata: disinstalla app, imposta schermata di blocco, disattiva schermata di blocco, quindi reinstalla. Se la schermata di blocco è abilitata, disinstalla, disattiva la schermata di blocco, imposta la schermata di blocco, quindi reinstalla. Non ho un dispositivo da riprodurre, ma sto cercando una soluzione alternativa per uno dei miei utenti. –

+0

Quando viene richiesto di immettere la password per l'archiviazione delle credenziali, la password corretta potrebbe essere il PIN di fallback che si sceglie quando si imposta il modello. Almeno, quello era il mio caso. – JerabekJakub

risposta

-4

Penso che questa sia la direzione giusta: Fare clic con il tasto destro del mouse sul progetto> Strumenti Android> Esporta pacchetto applicazione firmata Viene visualizzata la procedura guidata Esporta applicazione Android. Selezionare il progetto che voglio esportare, fare clic su Avanti. Viene visualizzata la schermata di selezione del keystore.

2

Mentre non conosco la risposta completa, posso aiutare a continuare la ricerca. L'implementazione di binder sull'altro lato di mBinder è native keystore. Se ricordo bene, il suo comportamento è 1) supportare le operazioni chiave a livello di software, o 2) delegare a una libreria keymaster fornita dall'OEM che presumibilmente si interfaccia con il keystore supportato dall'hardware dell'OEM. Ulteriori informazioni su questo here, here e here.

Nota: rinuncerò alla normale politica di SO di inserire il contenuto del collegamento esterno nella risposta, poiché vi collego a tre articoli che sono tutti> 1 pagina e sembra un po 'ridicolo postare un 6 risposta alla pagina ;-)

0

Se il codice è corretto, ricordare che è necessario impostare un PIN/PW/impronta digitale (sblocco sicuro) per il dispositivo in modo che il keystore inizi a funzionare. Un semplice tocco darà un tale errore se proverai a generare keypair.

Problemi correlati