2015-05-19 3 views
15

Я установил сертификат программно.Как программно удалить сертификат, установленный пользователем?

Я могу удалить его вручную, перейдя Settings -> Security -> Trusted Credentials -> User -> Choose the certificate and click the remove button

Я хочу, чтобы удалить сертификат программно.

Вот код, который я пробовал, но он не работал.

javax.security.cert.X509Certificate x509 = javax.security.cert.X509Certificate.getInstance(caRootCertBytes); 

KeyStore ks = KeyStore.getInstance("AndroidCAStore") 
if (ks != null) 
{ 
    ks.load(null, null); 
    Enumeration<String> aliases = ks.aliases(); 
    while (aliases.hasMoreElements()) 
    { 
     String alias = (String) aliases.nextElement(); 
     java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias); 
     String name = x509.getIssuerDN().getName();        
     if (cert.getIssuerDN().getName().contains(name)) 
     { 
      ks. deleteEntry(alias) 
     } 
    } 
} 

Ссылка почему я выбрал deleteEntry

Вот журнал ошибок, что я получил

05-19 18:27:40.789: W/System.err(14588): java.lang.UnsupportedOperationException 
05-19 18:27:40.792: W/System.err(14588): at com.android.org.conscrypt.TrustedCertificateKeyStoreSpi.engineDeleteEntry(TrustedCertificateKeyStoreSpi.java:82) 
05-19 18:27:40.792: W/System.err(14588): at java.security.KeyStore.deleteEntry(KeyStore.java:410) 
05-19 18:27:40.792: W/System.err(14588): at com.proj.test.MyActivity$4.onClick(MyActivity.java:336) 
05-19 18:27:40.792: W/System.err(14588): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162) 
05-19 18:27:40.792: W/System.err(14588): at android.os.Handler.dispatchMessage(Handler.java:102) 
05-19 18:27:40.792: W/System.err(14588): at android.os.Looper.loop(Looper.java:135) 
05-19 18:27:40.793: W/System.err(14588): at android.app.ActivityThread.main(ActivityThread.java:5254) 
05-19 18:27:40.793: W/System.err(14588): at java.lang.reflect.Method.invoke(Native Method) 
05-19 18:27:40.794: W/System.err(14588): at java.lang.reflect.Method.invoke(Method.java:372) 
05-19 18:27:40.794: W/System.err(14588): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
05-19 18:27:40.794: W/System.err(14588): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Этот вопрос несколько связан с моей другой question

Любая помощь приветствуется!

+0

Связанные с AOSP Bug Reporter: [Выпуск 174714: Нет Метод общего назначения для удаления CA: Сертификат, который был установлен программно] (https://code.google.com/p/ Android/вопросы/детали? ID = 174714). – jww

+0

@jww - Спасибо за сообщение. –

ответ

6

Похоже, что реализация интерфейса KeyStoreSpi просто не поддерживает удаление:

@Override 
public void engineDeleteEntry(String alias) { 
    throw new UnsupportedOperationException(); 
} 

https://android.googlesource.com/platform/external/conscrypt/+/master/src/platform/java/org/conscrypt/TrustedCertificateKeyStoreSpi.java#81

+0

Так что, не так ли, чтобы программно удалить установленный сертификат? –

+1

Вероятно, не из обычного пользовательского приложения. Но вы можете посмотреть, как это делают настройки Android: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.4.4_r1/com/ android/settings/TrustedCredentialsSettings.java # TrustedCredentialsSettings – Buddy

+0

Я не смог импортировать 'IKeyChainService' и' KeyChainConnection' ..I получить ** Невозможно разрешить ошибку символа **. –

5

Вы можете сделать это в Android 5.x с владельцем устройства с использованием метода uninstallCaCert(). Владелец устройства может быть установлен только до того, как устройство будет предоставлено.

https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#uninstallCaCert(android.content.ComponentName, байт [])

+1

Возможно ли использовать класс TrustedCertificateStore и' deleteCertificateEntry'? Ваш [блог в ICS Trust Store] (http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html) упоминает «TrustedCertificateStore». – jww

+0

Краткий ответ: Нет. Долгий ответ: вы не можете взаимодействовать с системными файлами без разрешений на системном уровне. Вероятно, вы можете что-то сделать с правами доступа root, но обычно это не очень хорошая идея. Не уверен, что делает приложение, но если сертификат используется только вашим приложением, не устанавливайте его в системном хранилище вообще. –

+0

@Durai: * «Чтобы проверить трафик SSL, мы делаем прошивку SSL ...» * - Я просто комментировал людей в рабочей группе TLS об этом. Или, вернее, загрязнение стандартов из-за модели безопасности веб-браузера. См. [TLS: запретить <1.2 на клиентах (но разрешить серверы)] (https://www.ietf.org/mail-archive/web/tls/current/msg16495.html). – jww

Смежные вопросы