Android P регистрирует странное исключение, когда я пытаюсь прочитать сертификат, который я импортировал в KeyStore извне. Я делаю следующее:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
//cert variable is a string with my self signed certificate
saveX509Certificate(cert, "example");
String key = encrypt("example");
Log.d("tag", key);
} catch (Exception e) {
e.printStackTrace();
}
}
public void saveX509Certificate(String certificate, String certificateAlias) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
X509Certificate myCert = (X509Certificate) CertificateFactory
.getInstance("X.509")
.generateCertificate(
new ByteArrayInputStream(certificate.getBytes(StandardCharsets.UTF_8)));
keyStore.load(null);
keyStore.setCertificateEntry(certificateAlias, myCert);
}
public String encrypt(String keyAlias) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException {
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
Certificate certificate = keyStore.getCertificate(keyAlias); //here's where the exception is thrown
PublicKey publicKey = certificate.getPublicKey();
return android.util.Base64.encodeToString(publicKey.getEncoded(), Base64.NO_WRAP);
}
Код работает хорошо и возвращает мой открытый ключ из сертификата, так что я в порядке, но я получил следующее уведомление в logcat:
KeyStore exception
android.os.ServiceSpecificException: (code 7)
at android.os.Parcel.createException(Parcel.java:1956)
at android.os.Parcel.readException(Parcel.java:1910)
at android.os.Parcel.readException(Parcel.java:1860)
at android.security.IKeystoreService$Stub$Proxy.get(IKeystoreService.java:786)
at android.security.KeyStore.get(KeyStore.java:195)
at android.security.keystore.AndroidKeyStoreSpi.engineGetCertificate(AndroidKeyStoreSpi.java:144)
at java.security.KeyStore.getCertificate(KeyStore.java:1120)
at com.example.mat.myapplication.MainActivity.encrypt(MainActivity.java:65)
at com.example.mat.myapplication.MainActivity.onCreate(MainActivity.java:44)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Вы когда-нибудь сталкивались с этим или знаете, что делать, чтобы избавиться от этого предупреждения? Мне нужно добавить это, когда я генерирую, например, Пара ключей RSA на устройстве, я не получаю это предупреждение при попытке получить закрытый ключ из хранилища ключей, это происходит только с импортированным сертификатом извне. Кроме того, код работает хорошо без уведомления об KeyStore Exception в предыдущих версиях Android, то есть Oreo, Nugat и Marshmallow.
Заранее спасибо!