Android P - исключение KeyStore android.os.ServiceSpecificException: (код 7) - PullRequest
0 голосов
/ 08 января 2019

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.

Заранее спасибо!

...