web-dev-qa-db-fra.com

Android P - Exception KeyStore Android.os.ServiceSpecificException

Si je lance ce code sur Android P, je reçois l'exception suivante:

private static KeyStore.PrivateKeyEntry getPrivateKeyEntry(String alias) {
        try {
            KeyStore ks = KeyStore
                    .getInstance(SecurityConstants.KEYSTORE_PROVIDER_Android_KEYSTORE);
            ks.load(null);
            KeyStore.Entry entry = ks.getEntry(alias, null);

            if (entry == null) {
                Log.w(TAG, "No key found under alias: " + alias);
                Log.w(TAG, "Exiting signData()...");
                return null;
            }

            if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
                Log.w(TAG, "Not an instance of a PrivateKeyEntry");
                Log.w(TAG, "Exiting signData()...");
                return null;
            }
            return (KeyStore.PrivateKeyEntry) entry;
        } catch (Exception e) {
            Log.e(TAG, e.getMessage(), e);
            return null;
        }
    }

Exception:

Exception KeyStore Android.os.ServiceSpecificException: (code 7) sur Android.os.Parcel.createException (Parcel.Java:1956) sur Android.os.Parcel.readException (Parcel.Java:1910) sur Android.os.Parcel.readException (Parcel.Java:1860) sur Android.security.IKeystoreService $ Stub $ Proxy.get (IKeystoreService.Java:786) sur Android.security.KeyStore.get (KeyStore.Java:195) sur Android.security.keystore.AndroidKeyStoreSpi.engineGetCertificateChain (AndroidKeyStoreSpi.Java:118) à Java.security.KeyStoreSpi.engineGetEntry (KeyStoreSpi.Java:484) sur Java.security.KeyStore.getEntry (KeyStore.Java:1560) à l'adresse com.phenodev.testenc.KeyStoreHelper.getPrivateKeyEntry (KeyStoreHelper.Java:151) à l'adresse com.phenodev.testenc.KeyStoreHelper.encrypt (KeyStoreHelper.Java:173) à l'adresse com.phenodev.testenc.KeyStoreEncryptor.encrypt (KeyStoreEncryptor.Java:19)

S'il vous plaît aider à le réparer.

12
phnmnn

Finalement j'ai trouvé une solution. Il semble que, depuis Android P (KeyStore.PrivateKeyEntry) keyStore.getEntry("alias", null) n’est pas un bon moyen d’obtenir une clé privée. 

Je pouvais me débarrasser de cet avertissement en accédant de la sorte à une clé privée/publique

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);

PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", null);
PublicKey publicKey = keyStore.getCertificate("alias").getPublicKey();
23
Dr Glass

Dans mon cas, l'avertissement était toujours là, même si les clés étaient la solution acceptée, mais seulement lorsque la clé n'existait pas encore.

L'avertissement provient de l'appel getCertificate, donc, pour l'éviter:

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);

PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", null);
PublicKey publicKey = privateKey != null ? keyStore.getCertificate("alias").getPublicKey() : null;
0
giroxiii