Android 9 - исключение KeyStore android.os.ServiceSpecificException - PullRequest
0 голосов
/ 26 августа 2018

Если я запускаю этот код на Android 9, я получаю следующее исключение:

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

Исключение:

Исключение KeyStore android.os.ServiceSpecificException: (код 7) на android.os.Parcel.createException (Parcel.java:1956) на android.os.Parcel.readException (Parcel.java:1910) на android.os.Parcel.readException (Parcel.java:1860) на android.security.IKeystoreService $ Stub $ Proxy.get (IKeystoreService.java:786) на android.security.KeyStore.get (KeyStore.java:195) на android.security.keystore.AndroidKeyStoreSpi.engineGetCertificateChain (AndroidKeyStoreSpi.java:118) в java.security.KeyStoreSpi.engineGetEntry (KeyStoreSpi.java:484) в java.security.KeyStore.getEntry (KeyStore.java:1560) at com.phenodev.testenc.KeyStoreHelper.getPrivateKeyEntry (KeyStoreHelper.java:151) в com.phenodev.testenc.KeyStoreHelper.encrypt (KeyStoreHelper.java:173) at com.phenodev.testenc.KeyStoreEncryptor.encrypt (KeyStoreEncryptor.java:19)

Пожалуйста, помогите исправить это.

Ответы [ 2 ]

0 голосов
/ 29 июля 2019

У меня была такая же проблема при получении asymmetricKey из AndroidKeyStore

Мое решение, основанное на ответе Dr Glass для получения ключей, было следующим: (aliasKey - ваша строка псевдонима)

PublicKey:

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
}

PrivateKey:

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
}

и с этим кодом у меня нет предупреждения в эмуляторе и / или устройстве с Android P

0 голосов
/ 12 сентября 2018

Наконец-то я нашел решение.Похоже, что Android P (KeyStore.PrivateKeyEntry) keyStore.getEntry("alias", null) не является правильным способом получить закрытый ключ.

Мне удалось избавиться от этого предупреждения, получив доступ к закрытому / открытому ключу таким образом

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

PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", null);
PublicKey publicKey = keyStore.getCertificate("alias").getPublicKey();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...