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