it-swarm.com.de

Android P - KeyStore-Ausnahme Android.os.ServiceSpecificException

Wenn ich diesen Code auf Android P ausführe, erhalte ich die folgende Ausnahme:

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

Ausnahme:

KeyStore-Ausnahme Android.os.ServiceSpecificException: (Code 7) bei Android.os.Parcel.createException (Parcel.Java:1956) bei Android.os.Parcel.readException (Parcel.Java:1910) bei Android.os.Parcel.readException (Parcel.Java:1860) bei Android.security.IKeystoreService $ Stub $ Proxy.get (IKeystoreService.Java:786) unter Android.security.KeyStore.get (KeyStore.Java:195) bei Android.security.keystore.AndroidKeyStoreSpi.engineGetCertificateChain (AndroidKeyStoreSpi.Java:118) at Java.security.KeyStoreSpi.engineGetEntry (KeyStoreSpi.Java:484) at Java.security.KeyStore.getEntry (KeyStore.Java:1560) at com.phenodev.testenc.KeyStoreHelper.getPrivateKeyEntry (KeyStoreHelper.Java:151) at com.phenodev.testenc.KeyStoreHelper.encrypt (KeyStoreHelper.Java:173) at com.phenodev.testenc.KeyStoreEncryptor.encrypt (KeyStoreEncryptor.Java:19)

Bitte helfen Sie, das Problem zu beheben.

12
phnmnn

Endlich habe ich eine Lösung gefunden. Es sieht so aus, da Android P (KeyStore.PrivateKeyEntry) keyStore.getEntry("alias", null) kein geeigneter Weg ist, um private Schlüssel zu erhalten. 

Ich konnte diese Warnung durch den Zugriff auf private/öffentliche Schlüssel auf diese Weise loswerden

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

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

Ich hatte das gleiche Problem beim Abrufen eines asymmetrischen Schlüssels aus AndroidKeyStore

Meine auf Dr. Glass basierende Lösung zum Abrufen von Schlüsseln lautete wie folgt: (aliasKey ist Ihre Alias-Zeichenfolge)

Öffentlicher Schlüssel:

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

val asymmetricKeyPublicKey = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    keyStore.getCertificate(aliasKey).publicKey
} else {
    val asymmetricKey = keyStore.getEntry(aliasKey, null) as KeyStore.PrivateKeyEntry
    asymmetricKey.certificate.publicKey
}

Privat Schlüssel:

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

val asymmetricKeyPrivateKey = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    keyStore.getKey(aliasKey, null) as PrivateKey
} else {
    val asymmetricKey = keyStore.getEntry(aliasKey, null) as KeyStore.PrivateKeyEntry
    asymmetricKey.privateKey
}

und mit diesem Code habe ich keine Warnung im Emulator und/oder Gerät mit Android P

1
MatPag

In meinem Fall war die Warnung immer noch vorhanden und erhielt die Schlüssel als akzeptierte Lösung, aber nur, wenn der Schlüssel noch nicht vorhanden war.

Die Warnung stammt vom getCertificate-Aufruf, um dies zu vermeiden:

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