2015-05-19 20 views
15

Zainstalowałem programistycznie certyfikat.Jak programowo usunąć zainstalowany certyfikat użytkownika?

jestem w stanie go odinstalować ręcznie przechodząc Settings -> Security -> Trusted Credentials -> User -> Choose the certificate and click the remove button

Chcę usunąć certyfikat programowo.

Oto kod, który próbowałem, ale nie zadziałał.

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

Ref dlaczego wybrałem deleteEntry

Oto dziennik błędów, które mam

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) 

To pytanie jest nieco podobne do mojej drugiej question

Każda pomoc jest mile widziana!

+0

pokrewnych na AOSP Reporter błędów: [Emisja 174714: Nie ogólny sposób celem usunięcia certyfikacie CA, który został zainstalowany programowo] (https://code.google.com/p/ android/issues/detail? id = 174714). – jww

+0

@jww - Dzięki za zgłoszenie. –

Odpowiedz

6

Wygląda na to, że wdrożenie interfejsu KeyStoreSpi prostu nie obsługuje usuwanie:

@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

Czy w ogóle nie ma programu, aby programowo usunąć zainstalowany certyfikat? –

+1

Prawdopodobnie nie pochodzi z normalnej aplikacji użytkownika. Możesz jednak sprawdzić, jak działa Ustawienia Androida: 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

Nie można zaimportować 'IKeyChainService' i' KeyChainConnection' .. Otrzymuję ** Nie można rozwiązać błędu symbolu **. –

5

Można to zrobić w Android 5.x z właścicielem urządzenia, stosując metodę uninstallCaCert(). Właściciel urządzenia można zainstalować tylko przed udostępnieniem urządzenia.

https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#uninstallCaCert(android.content.ComponentName bajt [])

+1

Czy można używać klasy' TrustedCertificateStore' i 'deleteCertificateEntry'? Twój [blog w ICS Trust Store] (http://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html) wspomina o 'TrustedCertificateStore'. – jww

+0

Krótka odpowiedź: Nie. Długa odpowiedź: nie można zepsuć plików systemowych bez uprawnień na poziomie systemu. Prawdopodobnie możesz zrobić coś z dostępem roota, ale zazwyczaj nie jest to świetny pomysł. Nie wiesz, co robi aplikacja, ale jeśli certyfikat jest używany tylko przez Twoją aplikację, nie instaluj go w ogóle w sklepie systemowym. –

+0

@Durai: * "Aby sprawdzić ruch SSL, wykonujemy przekłuwanie SSL ..." * - Właśnie komentowałem to grupie roboczej TLS. Lub bardziej poprawnie, zanieczyszczenie standardów ze względu na model zabezpieczeń przeglądarki/przeglądarki. Zobacz [TLS: zakaz <1.2 na klientach (ale zezwól na serwery)] (https://www.ietf.org/mail-archive/web/tls/current/msg16495.html). – jww

Powiązane problemy